Ich versuche, die automatische Referenzzählung in iOS 5 zu lernen. Jetzt sollte der erste Teil dieser Frage einfach sein:
Ist es richtig, dass ich bei Verwendung von ARC KEINE expliziten Release-Property-Anweisungen in meinen Dealloc schreiben muss? Mit anderen Worten, ist es wahr , dass die folgenden Fälle nicht eine explizite dealloc braucht?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Meine nächste und wichtigere Frage stammt aus einer Zeile im Dokument " Übergang zu ARC-Versionshinweisen" :
Sie müssen keine Instanzvariablen freigeben (können dies auch nicht), müssen jedoch möglicherweise [self setDelegate: nil] für Systemklassen und anderen Code aufrufen, der nicht mit ARC kompiliert wurde.
Dies wirft die Frage auf: Woher weiß ich, welche Systemklassen nicht mit ARC kompiliert wurden? Wann sollte ich meinen eigenen Dealloc erstellen und explizit stark beibehaltene Eigenschaften auf Null setzen? Sollte ich davon ausgehen, dass alle in Eigenschaften verwendeten NS- und UI-Framework-Klassen explizite Freigaben erfordern?
Es gibt eine Fülle von Informationen zu SO und anderswo zu den Praktiken der Freigabe des Backing Ivar einer Eigenschaft bei Verwendung der manuellen Referenzverfolgung, aber relativ wenig dazu bei Verwendung von ARC.
quelle
MyController : UIViewController
Klasse habe, die eine UIView erstellt und besitzt und auch den Delegaten der Ansicht auf sich selbst setzt. Es ist der alleinige Inhaber dieser Ansicht. Wenn der Controller freigegeben wird, sollte auch die Ansicht freigegeben werden. Ist es dann wichtig, ob der Delegatenzeiger baumelt?UIWebView
, wird in den Dokumenten ausdrücklich angegeben, dass Sie den Delegaten ausschließen müssen.unsafe_unretained
genau einerassign
Eigenschaft und ist das normale Verhalten für delegierte Beziehungen unter MRR. Diese müssen herausgerechnet werden.Nur um die gegenteilige Antwort zu geben ...
Kurze Antwort : Nein, Sie müssen
dealloc
unter ARC keine automatisch synthetisierten Eigenschaften ausschließen . Und Sie müssen den Setter nicht für diejenigen in verwendeninit
.Lange Antwort : Sie sollten
dealloc
auch unter ARC keine benutzerdefinierten synthetisierten Eigenschaften verwenden . Und Sie sollten den Setter für diejenigen in verwendeninit
.Der Punkt ist, dass Ihre benutzerdefinierten synthetisierten Eigenschaften in Bezug auf die Aufhebung sicher und symmetrisch sein sollten.
Ein möglicher Setter für einen Timer:
Ein möglicher Setter für eine Bildlaufansicht, eine Tabellenansicht, eine Webansicht, ein Textfeld, ...:
Ein möglicher Setter für eine KVO-Eigenschaft:
Dann müssen Sie nicht für jeden Code duplizieren
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... und Ihr Eigentum sicher öffentlich bekannt gemacht. Wenn Sie sich Sorgen über Null-Out-Eigenschaften gemacht habendealloc
, ist es möglicherweise an der Zeit, Ihre Setter erneut zu überprüfen.quelle