2010-11-18 4 views
7

Lorsque nous assignons de la mémoire à une variable de classe, devrions-nous la libérer ou la mettre à zéro dans la méthode dealloc? Quelle est la meilleure pratique?release Vs nil - Meilleure pratique

+0

pouvez-vous préciser ce que vous entendez par "variable de classe"? – ohhorob

Répondre

11

Les meilleures pratiques:

[foo release]; // ensures that memory is released 
foo = nil; // ensures that there is no dangling pointer to released memory 

Autres notes:

Lorsque vous attribuez à une propriété déclarée à retenir,

// in your .h 
@property (retain) MyObject *foo; 

// in your .m 
self.foo = bar; // bar is retained; whatever foo previously pointed at is released 

il publiera ce qu'il pointait précédemment et conserver le nouvel objet assigné.

Ainsi, vous pouvez utiliser:

self.foo = nil; 

et il libérera tout ce que foo pointait. Toutefois, si votre propriété n'a pas été déclarée comme ayant une sémantique de stockage de conservation, cela ne libérera pas implicitement tout ce que foo pointait. En outre, comme Ryan l'a souligné, une propriété peut être surchargée pour avoir des effets secondaires. Pour cette raison, il est préférable de suivre le modèle de toujours utiliser:

[foo release]; 

Pour vous assurer que vous ne disposez pas d'un pointeur ballants à la mémoire libérée, vous pouvez suivre ce avec:

foo = nil; 

Si vous n'utilisez pas des propriétés avec garder la sémantique, vous besoin de libérer tout ce qui était stocké dans la variable:

[foo release]; 

EDIT: Voir aussi la réponse suivante à une autre question qui explique ceci:

iPhone - dealloc - Release vs. nil

+2

Il est préférable de toujours utiliser -release au lieu de l'accesseur de propriété, car les setters peuvent être remplacés par des effets secondaires. Vous ne voulez pas d'effets secondaires dans votre méthode dealloc. – Ryan

+0

Merci Ryan - J'ai édité ma réponse pour refléter cela. – Greg

+0

Excellent. Merci Monsieur!!! – Abhinav

Questions connexes