2010-10-27 4 views
0

Dans une classe modèle UIViewController iphone vous verrez ceci:iphone - question sur plus de libération

- (void)viewDidUnload { 

    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

Mais si je mets self.myOutlet = nul dans viewDidUnload, et j'ai aussi [Communiqué de self.myOutlet] dans la méthode dealloc, est-ce que self.myOutlet n'est pas trop relâché, puisque le mettre à zéro va déjà mettre son compte de retenue à zéro?

Si je ne divulguons pas dans dealloc(), rapporte Fuites une fuite de mémoire, car il ne voit jamais self.myOutlet d'être libérés, en supposant que j'ai quelque chose comme ça dans le fichier d'en-tête:

@property (nonatomic, retain) UIView *myOutlet; 

Répondre

2

Si vous définissez self.myOutlet à nil dans viewDidUnload, l'appel dans dealloc à [myOutlet release] enverra simplement un message de libération à nil. Il est parfaitement acceptable d'envoyer des messages à nil. Rien de mal n'arrivera et vous ne relâcherez rien.

La chose à surveiller est l'objet référencé libère par myOutlet dans viewDidUnloadsans mise myOutlet-nil. Dans ce cas, vous aurez un accident dans dealloc. Pourquoi? Parce que myOutlet fera toujours référence à l'emplacement de mémoire une fois occupé par l'objet myOutlet, et votre méthode dealloc va essayer d'envoyer tout ce qui est actuellement à cet emplacement de mémoire un message release.

+0

Merci les gars. C'est ce que j'espérais entendre. – sol

1

-(void)viewDidUnload est appelée lorsqu'un avertissement de mémoire est émise, -(void)dealloc est appelé à la destruction complète d'une vue (ce ne sont pas les mêmes). Par conséquent, vous devriez faire les deux

- (void)viewDidUnload { 

    // Release any retained subviews of the main view. 
    self.myOutlet = nil; 
} 
- (void)dealloc { 
    [self.myOutlet release]; 
} 

Edit: Qu'est-ce que James a dit le point favorise.

À la votre!

1

Ce n'est pas la variable qui a un nombre de retenue; c'est l'objet. Lorsque vous faites self.something = nil, il libère effectivement l'objet - et il définit la variable pour pointer vers nil. Donc, tous les autres messages release envoyés à self.something ne vont pas à l'objet original. Au lieu de cela, ils vont à la nouvelle valeur, nil, qui ignore heureusement tout ce que vous lui dites.