J'essaie d'apprendre le comptage automatique des références dans iOS 5. La première partie de cette question devrait maintenant être simple:
Est-il correct que je n'ai PAS besoin d'écrire des déclarations de propriété de libération explicites dans mon dealloc lorsque j'utilise ARC? En d'autres termes, est-il vrai que ce qui suit n'a PAS besoin d'un dealloc explicite?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Ma question suivante et la plus importante vient d'une ligne du document Transitioning to ARC Release Notes :
Vous n'avez pas à (en effet pas) libérer les variables d'instance, mais vous devrez peut-être invoquer [self setDelegate: nil] sur les classes système et tout autre code qui n'est pas compilé à l'aide d'ARC.
Cela soulève la question: comment savoir quelles classes système ne sont pas compilées avec ARC? Quand dois-je créer mon propre dealloc et définir explicitement les propriétés conservant fortement la valeur nulle? Dois-je supposer que toutes les classes de framework NS et UI utilisées dans les propriétés nécessitent des deallocs explicites?
Il existe une mine d'informations sur le SO et ailleurs sur les pratiques de libération de l'ivar de soutien d'une propriété lors de l'utilisation du suivi manuel des références, mais relativement peu à ce sujet lors de l'utilisation de l'ARC.
MyController : UIViewController
classe qui crée et possède un UIView et définit également le délégué de la vue à lui-même. Il est le seul propriétaire de ce point de vue. Lorsque le contrôleur est libéré, la vue doit également être libérée. Est-il alors important que le pointeur du délégué soit suspendu?UIWebView
, la documentation indique explicitement que vous devez supprimer le délégué.unsafe_unretained
c'est exactement l'équivalent d'uneassign
propriété et c'est le comportement normal pour les relations de délégué sous MRR, et celles-ci doivent être supprimées.Juste pour donner la réponse opposée ...
Réponse courte : non, vous n'avez pas à supprimer les propriétés auto-synthétisées
dealloc
sous ARC. Et vous n'avez pas besoin d'utiliser le setter pour ceux qui sont eninit
.Réponse longue : vous ne devriez pas supprimer les propriétés synthétisées sur mesure
dealloc
, même sous ARC. Et vous devriez utiliser le setter pour ceux eninit
.Le fait est que vos propriétés synthétisées personnalisées doivent être sûres et symétriques en ce qui concerne l'annulation.
Un poseur possible pour une minuterie:
Un setter possible pour un scrollview, tableview, webview, textfield, ...:
Un poseur possible pour une propriété KVO:
Ensuite , vous ne devez pas dupliquer tout code
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... et votre propriété peut être rendue publique en toute sécurité. Si vous vous inquiétez de l'absence de propriétésdealloc
, il est peut-être temps de vérifier à nouveau vos setters.la source