Puis-je définir des propriétés à néant en dealloc lors de l'utilisation de l'ARC?
Je suis en train d'apprendre Automatique de Comptage de Référence dans iOS 5. Maintenant, la première partie de cette question devrait être facile:
-
Est-il exact que je ne PAS besoin d'écrire explicite
presse-états des biens dans mon dealloc lors de l'utilisation de l'ARC? Dans d'autres
mots, est-il vrai que ce qui suit ne PAS besoin d'un explicite
dealloc?@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
-
Mon prochain et la plus importante question qui me vient à partir d'une ligne dans le La transition à l'ARC Notes de Version document:
Vous n'avez pas à (voire impossible) de libération des variables d'instance, mais vous pouvez avoir besoin d'invoquer [auto setDelegate:nil] sur le système de classes et d'autres code n'est pas compilé à l'aide de l'ARC.
Cela pose la question: comment puis-je savoir quel système de classes ne sont pas compilés avec l'ARC? Quand dois-je créer mon propre dealloc et de définir explicitement fortement en conservant les propriétés à néant? Devrais-je assumer toutes les NS de l'INTERFACE et de classes du framework utilisé dans les propriétés requièrent explicite deallocs?
Il y a une foule de renseignements sur DONC et d'ailleurs sur les pratiques de la libération d'une propriété du support de ivar lors de l'utilisation du manuel de référence de suivi, mais relativement peu à ce sujet lors de l'utilisation de l'ARC.
Vous devez vous connecter pour publier un commentaire.
Réponse courte: non, vous n'avez pas à néant propriétés dans
dealloc
en vertu de l'ARC.Réponse longue: Vous ne devriez jamais nul propriétés dans
dealloc
, même dans le manuel de gestion de la mémoire.Dans MRR, vous devez libérer votre ivars. Nilling propriétés appelle setters, qui peut invoquer le code qu'il ne devrait pas toucher à
dealloc
(par exemple, si votre classe ou d'une sous-classe, remplace le setter). De même, il peut déclencher KVO notifications. En libérant le ivar au lieu d'éviter ces comportements indésirables.À l'ARC, le système libère automatiquement tout ivars pour vous, donc si c'est tout ce que vous faites, vous n'avez même pas à mettre en œuvre
dealloc
. Toutefois, si vous avez des non-objet ivars qui ont des besoins spéciaux de manutention (par exemple allouée tampons que vous avez besoin defree()
) vous avez encore à faire face à ceux dansdealloc
.En outre, si vous avez défini vous-même en tant que délégué de tous les objets, vous devez nations unies à l'effet que la relation
dealloc
(ce qui est le bit sur l'appel de[obj setDelegate:nil]
). La note à ce sujet sur les classes qui ne sont pas compilés avec l'ARC est un clin d'œil en direction de la faiblesse des propriétés. Si la classe explicitement les marques de sondelegate
propriétéweak
alors vous n'avez pas à faire cela, parce que la nature de la faiblesse des propriétés signifie qu'il ira nul pour vous. Toutefois, si la propriété est marquéeassign
alors vous devriez néant dans votredealloc
, sinon la classe est laissé avec une balançant pointeur et sera susceptible de se bloquer si il essaie de message de son délégué. Notez que cela s'applique uniquement aux non-conservé relations, tels que des délégués.MyController : UIViewController
classe qui crée et possède une UIView et définit également le point de vue du délégué à lui-même. Elle est la seule à retenir propriétaire de ce point de vue. Lorsque le contrôleur reçoit dealloc ed, la vue doit alors également obtenir dealloc ed. Est-il alors question si le délégué pointeur est bancale?UIWebView
, les docs explicitement état vous avez besoin à néant le délégué.unsafe_unretained
est exactement équivalent à unassign
de la propriété et est le comportement normal pour les relations délégué en vertu de MRR, et ces le besoin d'être nul en sortir.dealloc
, j'ai isoler ce code dans une méthode qui, elle, est écrit à l'appel que peu de code que possible, et est explicitement décrite comme "cette méthode est appelée depuis-dealloc
". J'ai ensuite appeler cette méthode à partir de l'accesseur et de-dealloc
.dealloc
peut causer des problèmes. De mon expérience, lorsque le setter est appelé et un problème survient, en général, vous savez sur le problème immédiatement (application se bloque). Lorsque vous n'appelez pas le setter et devrait être publié peu de données, il vous suffit d'une fuite. À mon humble avis il est bien d'utiliser les deux méthodes si vous n'avez pas les mélanger. En général, les problèmes sont faciles à trouver et n'apparaissent pas souvent avec un bon style de programmation. Dans mon projet actuel, nous avons environ 300 classes et dans une seule de les appeler ou ne pas appeler les organismes de normalisationdealloc
fait la différenceNSZombie
classe, qui lève une exception lorsque messaged.dealloc
! C'est incroyablement dangereux! KVO (et les gens primordial setters dans les sous-classes), c'est précisément la raison pour toujours éviter les accesseurs de propriété dansdealloc
.dealloc
, sauf dans de très spécifiques et étroitement contrôlée bord des cas (c'est-à-dire, effectivement jamais), est flat-out faux. Il y a beaucoup de raisons pourquoi, mais la réponse est simple, à l'intérieur dedealloc
les invariants que votre classe expose ne sont pas entretenus, et rien ne doit être en interaction avec votre classe lors de ses invariants sont cassés qui n'ont pas les connaissances explicites au sujet de sa mise en œuvre. Aussi, nilling propriétés/ivars dansdealloc
est inutile de toute façon avec l'ARC.dealloc
(que vous n'avez vraiment pas le faire), alors vous avez certainement devrait attribuer à l'ivar directement au lieu de la propriété (en général, à la foisdealloc
etinit
devrait accès ivars directement au lieu de propriétés). Cela est vrai pour les deux ARC et MRR.Juste pour donner à l'opposé de réponse...
Réponse courte: non, vous n'avez pas à néant auto-synthétisé propriétés dans
dealloc
en vertu de l'ARC. Et vous n'avez pas à utiliser le setter pour ceuxinit
.Réponse longue: Vous devrait néant personnalisé-synthétisé propriétés dans
dealloc
, même en vertu de l'ARC. Et vous devez utiliser le setter pour ceuxinit
.Le point est votre custom-synthétisé les propriétés doivent être sûrs et symétrique concernant l'annulation.
Une possible définition pour une minuterie:
Une possible définition pour une scrollview, tableview, webview, textfield, ...:
Une possible définition pour un KVO propriété:
Alors vous n'avez pas à dupliquer le code pour
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... et que votre propriété peut en toute sécurité être rendu public. Si vous étiez inquiet au sujet de néant propriétés dansdealloc
, alors il peut être temps vous vérifiez de nouveau votre setters.