2010-12-27 2 views
1

je suis tombé sur cette méthode:Pourquoi mettre à zéro après le relâchement?

-(void) someMethod { 
    NSMutableArray *anArray = [[NSMutableArray alloc] init]; 
    // Do stuff with anArray ... 
    [anArray release]; 
    anArray = nil; 
} 

Le réglage du tableau à zéro nécessaire?
Dans ce code en envoyant un message de libération au tableau, le tableau sera libéré.

Répondre

5

Dans ce cas, il s'agit d'un gaspillage inutile de touches car la variable anArray est immédiatement hors de portée.

Dans d'autres cas, où la variable reste dans la portée pendant un moment après que vous ayez libéré l'objet pointant vers elle, c'est une bonne idée car, si vous la dérérez accidentellement, vous obtiendrez une EXC_BAD_ACCESS facile à repérer et si vous lui envoyez un message, il sera ignoré (sauf pour renvoyer nil/0).

+0

Correction: il ne sera pas 'ignoré', il reviendra à zéro. –

+0

@Wayne Hartman: Oui, je sais, j'étais paresseux. Réponse corrigée. – JeremyP

+0

+1 pour la réponse à l'essentiel – viral

0

Non, ce n'est pas nécessaire.
Il est juste pour des raisons de sécurité (à ne pas envoyer un message à un zombie)
Et vous pouvez tester si votre Ivar est nul ou non réallouer:

[ivar release]; 
ivar=nil; 
... 
if (ivar==nil) { 
    ivar = [[NSObject alloc] init]; 
} 
[ivar setValue:@"toto"]; 
+0

Oui, si vous ne le définissez pas à zéro, vous ne pouvez pas tester == nil (que vous pourriez vouloir de temps en temps). – Jake

+0

Et c'est nécessaire si vous souhaitez utiliser le récupérateur de place. – Arafangion

+1

@Arafangion: Avec GC, vous n'avez pas besoin de sortir –

0

Il est pas nécessaire, mais considéré comme un bon comportement pour définir pointeurs pendants à zéro.

4

Comme d'autres l'ont mentionné, le définir à nil aidera votre code à ne pas se bloquer si vous référencez l'objet ed dealloc. Si vous référencez un dealloc ed vous obtiendrez EXC_BAD_ACCESS erreur et votre application va planter. Étant donné qu'un objet nil renvoie nil si un message lui est envoyé, votre application ne plantera pas.

Dans l'exemple que vous fournissez, il n'est pas nécessaire de le mettre à nil car il est contenu dans une méthode. Toutefois, vous ne voulez pas nil sur une variable si vous prévoyez de l'utiliser ailleurs dans le code, puisque la valeur sera alors nil.

Questions connexes