2010-08-19 9 views

Répondre

16

Oui, elle est absolument utilisée lorsque [super dealloc] est appelée. Une fois que [super dealloc] est appelée, vous ne pouvez plus compter sur la machine NSObject (ou quelle que soit votre classe racine) pour fonctionner correctement. Après tout, la méthode -dealloc de votre super-classe devrait appeler sa superclasse, etc. jusqu'à ce que la méthode de la classe racine -dealloc soit appelée. À ce stade, tout ce que ces classes allouent pour faire leur travail est potentiellement parti et vous êtes dans un territoire indéfini si vous essayez d'en utiliser.

Votre méthode -dealloc doit toujours ressembler à

- (void)dealloc 
{ 
    // release my own stuff first 

    [super dealloc]; 
} 
+0

merci pour la réponse descriptive! juste curieux, cela peut-il causer une erreur KERN_PROTECTION ou KERN_INVALID_ADDRESS? –

+1

@Sheehan Alam: 'dealloc' de NSObject libère l'objet. Accéder 'self' après avoir traversé ça équivaut à accéder à une mémoire libérée - cela pourrait provoquer une erreur ou faire beaucoup plus bizarre. – Chuck

+1

@Sheeham, Oui. C'est une possibilité. –

13

Oui. Dernier. Toujours.

+2

Lorsque vous utilisez [super dealloc]; l'objet de base est détruit. Si vous utilisez des données déclarées dans l'objet de base, cela provoquera un plantage. Vous devriez l'appeler en dernier – Felics

4

Oui, [super dealloc] doit toujours être le dernier, comme dit ci-dessus, parce que le référencement self ou tout autre internals généralement pris pour acquis ne fonctionnera pas, et peuvent se bloquer, comme aussi dit ci-dessus.

Une raison supplémentaire ne dit plus haut est que Ivars sont dans la partie de la mémoire pointée par self, donc si vous deviez faire quoi que ce soit avec (comme la libération) ces Ivars après [super dealloc], vous serait également déréférencement mémoire libérée. J'ai dit 'peut planter' ci-dessus, parce que lorsque vous faites cela incorrectement, il a tendance à ne pas tomber en panne, ce qui est logique étant donné que la mémoire n'est pas écrasée tant qu'elle n'est pas réutilisée. Cela rend la situation encore plus difficile, car vous risquez d'avoir un bug qui ne se produit que de temps en temps, ce qui le rendra très difficile à trouver au cas où il se ferait exploser au visage.

Autre que cela, vous êtes parfaitement bien si vous libérant une variable locale ou tout le reste après [super dealloc], et vous pouvez, si vous voulez vraiment, faire quelque chose comme

id local = ivar; 
[super dealloc]; 
[local release]; 

en toute sécurité, mais dans le intérêt de la cohérence, ne le faites pas.

En résumé, oui, [super dealloc]doit être être la dernière chose dans -dealloc.

Questions connexes