В чем разница между этими двумя различными строками Objective-C, и почему один работает, а не другой? - PullRequest
0 голосов
/ 12 апреля 2010

Если я попытаюсь выпустить tempSeedsArray после seedsArray = tempSeedsArray, я получу EXEC_BAD_ACCESS, и Instruments покажет, что tempSeedsArray был выпущен дважды. Вот мой viewWillAppear метод:

- (void)viewWillAppear:(BOOL)animated {  
    NSString *arrayFilePath = [[NSBundle mainBundle] pathForResource:@"SeedsArray" ofType:@"plist"];  
    NSLog(@"HIT!");  
    NSMutableArray *tempSeedsArray = [[NSMutableArray alloc] initWithContentsOfFile:arrayFilePath];  
    seedsArray = tempSeedsArray;  
    NSLog(@"%u", [seedsArray retainCount]);  
    [seedsArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];  
    [super viewWillAppear:animated];  
}

seedsArray - это NSMutableArray, установленный как свойство nonatomic и retain, и синтезируется.

Однако, если я изменю seedsArray = tempSeedsArray на self.seedsArray = tempSeedsArray (или [self seedsArray] = tempSeedsArray и т. Д.), Я могу отпустить tempSeedsArray. Может ли кто-нибудь объяснить мне просто, почему это так, потому что я очень растерялся!

Спасибо

1 Ответ

2 голосов
/ 12 апреля 2010
  1. seedsArray = ... присваивается полю seedsArray .
  2. self.seedsArray = ... вызывает setSeedsArray:, который является установщиком для свойства seedsArray .

Если вы @synthesize seedsArray, эти две формы будут вести себя почти одинаково (см. Комментарии @ JeremyP ниже), но если вы определите свой собственный установщик, только вторая форма установит свойство и вызовет ваш код.

...