2008-12-12 4 views
3

J'ai vu un exemple de code source qui utilise différentes façons de libérer/libérer des objets, alors je me demandais quelle est la meilleure façon de le faire. Quelques options -dealloc:Meilleure pratique pour nettoyer la mémoire des applications iPhone?

1) Les objets de presse

- (void)dealloc { 
    [obj1 release]; 
    [obj2 release]; 
    [super dealloc]; 
} 

2) objets Set à zéro

- (void)dealloc { 
    self.obj1 = nil; 
    self.obj2 = nil; 
    [super dealloc]; 
} 

3) désallouer objets directement

- (void)dealloc { 
    [obj1 dealloc]; 
    [obj2 dealloc]; 
    [super dealloc]; 
} 

Quel chemin est le meilleur? Avantages et inconvénients pour chacun?

Répondre

8

La méthode 1 est la seule méthode recommandée. C'est aussi une bonne pratique de les mettre à zéro APRÈS les avoir publiées.

La méthode 2 ne fonctionne que pour les propriétés qui gèrent leur propre objet/valeur de conservation, donc elle n'est pas universellement applicable. Et si vous implémentez votre propre méthode setter qui effectue d'autres actions lorsque la propriété change, vous pouvez obtenir des effets secondaires indésirables en l'appelant dans [dealloc].

La méthode 3 enfreint le principe du comptage de référence car elle libère les objets même si quelque chose d'autre les maintient, alors quand les autres objets y accèdent, votre programme se bloque. Vous n'êtes jamais censé appeler [dealloc] directement - laissez le runtime l'appeler quand le dernier propriétaire appelle [release].

+0

D'accord. La méthode 1 est la meilleure. La méthode 3 est à peu près garantie de planter votre application. Et la méthode 2, comme l'a dit Marco, peut causer des effets secondaires involontaires. Le but de la méthode dealloc est de libérer tous les objets que vous détenez. Appeler la libération sur ces objets est la seule chose qui a du sens. – Alex

+0

J'utilise la méthode 2 chaque fois que j'utilise une propriété lourde et que je cible l'exécution moderne (où je ne déclare même pas d'ivars directement). Certes, c'est seulement parce que gcc ne vous permet pas encore d'accéder directement aux ivars autogénérés (bien que cela arrive). –

1

Si obj1 et obj2 sont des propriétés utilisant des accesseurs @ synthesize-d, alors la méthode 1 et la méthode 2 sont équivalentes. Si l'une de ces deux conditions n'est pas vraie, l'effet est plutôt différent. Si elles ne sont pas des propriétés, alors la méthode 2 place simplement les pointeurs à zéro sans rien faire qui libérerait les objets. Et si elles sont des propriétés mais que vous avez implémenté vos propres méthodes setter, la méthode 2 appelle ces méthodes avec "nil" comme argument. Que cela soit équivalent ou non à la méthode 1 dépend de la manière dont vous avez implémenté ces méthodes. Si vos setters personnalisés font quelque chose de significatif quand l'argument est nul, la méthode 2 ferait en sorte que ce code soit exécuté. Comme l'a dit Marco, la méthode 3 est tout simplement erronée. Si vous avez vu un exemple de code, l'auteur peut ne pas savoir ce qu'il fait.

+0

"Si obj1 et obj2 sont des propriétés utilisant des accesseurs @ synthesize-d, alors la méthode 1 et la méthode 2 sont équivalentes." Non, ils ne le sont pas. La méthode 1 appelle un accesseur, avec des effets secondaires possibles, mais pas la méthode 2. Vous ne devriez * pas * utiliser la méthode 2. – mmalc