La méthode Dealloc dans iOS et la définition des objets à néant
J'ai plutôt une question de base. Dans certains exemples que j'ai vu, les objets sont tout juste sortis dans le dealloc méthode. Dans d'autres, les objets sont libérés et nil
. Est-il une raison pour cela? Est mise à néant après la libération avantageux?
pour les non-d'arc, à droite?
OriginalL'auteur Mason | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
Trois façons de dealloc
1. Il suffit de relâcher
Maintenant l'objet de points de référence à une position aléatoire, qui peut être de deux choses l'une:
L'effet d'un autre appel de méthode par le biais de ce pointeur est l'un de ces trois (dont un n'est pas défini):
EXC_BAD_ACCESS
parce que le pointeur pointe à la poubelle.2. Libération et le néant
Maintenant l'objet de référence est nulle et les autres appels de méthode sont ignorés. Cela peut silencieusement cause définie, mais imprévues effet latéral dans votre code, mais au moins il n'est pas planter votre application.
3. Néant et la libération
C'est le même qu'avant, mais il supprime cette petite fenêtre entre la libération et de néant où l'objet de points de référence pour un objet non valide.
Laquelle est la meilleure?
C'est une question de choix:
NSZombieEnabled=TRUE
puis il suffit de libération, n'est pas nul, le zombie!Les Macros et les zombies
Un moyen facile de reporter votre choix à l'aide d'une macro. Au lieu de cela
[airplane release]
vous écriresafeRelease(x)
où safeRelease est la macro suivante que vous ajoutez à votre .pch fichier cible:Cette macro ne respecte pas les zombies. Voici le problème: lorsque
NSZombieEnabled
estTRUE
l'objet se transforme en unNSZombie
. Si vous néant de son objet de référence, un appel adressé à lui, sera ignoré.Pour remédier à cela, voici une macro à partir d' Kevin Ballard qui définit le pointeur valide composé de référence UNIQUEMENT lorsque
NSZombieEnabled
estFALSE
. Cela garantit un incident au cours de débogage temps si les zombies ne sont pas activés, mais laisse les zombies en être autrement.Références
Apple n'a pas une recommandation sur laquelle on est le mieux. Si vous voulez lire les pensées de la communauté, voici quelques liens (le commentaire threads sont très bien aussi):
"dans ce cas, votre application se bloque" dans CE cas, votre application se bloque? "Votre appel se bloque" QUEL appel? Je ne vois pas de demander à propos de tout appel
Je faisais allusion (dans ma tête) pour les appels de méthode sur la sorti du pointeur. J'ai édité pour plus de précisions.
Vous recommandons d'utiliser l'arc dans ios7. vous ne pouvez pas appeler dealloc
La mise en œuvre de dealloc, ne pas appeler l'implémentation de la superclasse. developer.apple.com/reference/objectivec/nsobject/...
OriginalL'auteur Jano
Cet extrait couvre toutes les bases et est prêt à couper et coller dans un
.pch
fichier.Le code est fonctionnellement équivalent à Jano deuxième version de
safeRelease
, mais ajoute de la documentation et de la conformité avec Google normes de codage.OriginalL'auteur funroll
Si il y a un
dealloc
appel à plus d'une place, la définition de la variable d'objet à néant fait en sorte qu'il ne sera pas libéré plus d'une fois par erreur. Même logique si la fonction avec ladealloc
est appelé à partir de plus d'un endroit, ou peut être appelée de façon arbitraire par le code externe (j'. e. d'autres classes).Dans la vraie vie, cela se produit généralement lorsque l'affichage de l'objet est "réutilisable" - prend en charge plusieurs tours de contenu d'initialisation/démontage. Le
nil
-ness de pointeurs d'objet devient alors un précieux élément de l'état de l'objet - cela signifie que l'objet est "vide" à l'heure actuelle.Désolé pour les généralités.
dealloc
Lorsque cette réponse a été écrit, vous étiez censé le faire 🙂 Automatique de Comptage de Référence (ARC) n'a pas été toujours autour de.
Non, vous n'avez JAMAIS été censé appeler
dealloc
vous-même, sauf pour[super dealloc]
OriginalL'auteur Seva Alekseyev
Est-ce comme ce que vous dites?
OriginalL'auteur Nick