0

Si j'essaie de libérer tempSeedsArray après seedsArray = tempSeedsArray, je reçois un EXEC_BAD_ACCESS, et Instruments montre que tempSeedsArray a été publié deux fois. Voici ma méthode viewWillAppear:Quelle est la différence entre ces deux différentes lignes de l'objectif-C, et pourquoi travaille-t-on et pas l'autre?

- (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 est un NSMutableArray défini comme un nonatomic et une propriété retain et est synthétisé.

Cependant, si je change seedsArray = tempSeedsArray en self.seedsArray = tempSeedsArray (ou [self seedsArray] = tempSeedsArray etc.), je peux publier tempSeedsArray. Quelqu'un pourrait-il m'expliquer simplement pourquoi cela est, car je suis très confus!

Merci

Répondre

2
  1. seedsArray = ... attribue au seedsArraychamp.
  2. self.seedsArray = ... appelle setSeedsArray:, qui est l'accesseur pour la propriété seedsArray.

Si vous @synthesize seedsArray, ces deux forme se comportent à peu près les mêmes (voir les commentaires de @ JeremyP ci-dessous), mais si vous définissez votre propre setter, seule la deuxième forme définira la propriété et invoquer votre code.

+0

alors pourquoi est-ce que même si j'ai synthétisé 'seedsArray',' seedsArray = ... 'et' self.seedsArray = ... 'semblent se comporter différemment? (Je n'ai pas de setter personnalisé) – jrtc27

+2

Parce que ces deux lignes ne sont pas les mêmes si vous synthétisez seedArray. Le premier affecte simplement le pointeur tempSeedsArray à la variable d'instance seedsArray. La seconde envoie un message setSeedsArray: à l'objet avec la propriété qui fait trois choses: 1. conserve l'objet référencé par tempSeedsArray, 2. affecte tempSeedsArray à la variable d'instance pour la propriété, 3. libère l'objet précédemment référencé par la variable d'instance . – JeremyP

+0

ok merci les gens;) – jrtc27