2012-06-21 16 views
5

Ich habe eine kurze Frage über ARC in iOS. (Entschuldigung, ich habe so viele Fragen dieser Art gestellt, aber ich bin einfach so verwirrt bezüglich der Speicherverwaltung.). Es ist wichtig zu beachten, dass ich nie das alte Speicherverwaltungssystem (retain, release, assign ... usw.) verwendet habe, so dass ich nicht wirklich weiß, was diese Begriffe bedeuten.Wann werden starke Eigenschaften in ARC in iOS veröffentlicht?

Im Moment bin ich verwirrt darüber, was ich tun muss, um sicherzustellen, dass starke Eigenschaften richtig freigegeben werden. Angenommen, ich mache eine Schul-App und mein School Objekt enthält starke Eigenschaftsreferenzen auf 5 verschiedene Child Objekte (nicht in einem Array). Jedes Objekt Child hat einen starken Zeiger (Eigenschaft) auf ein Objekt Book.

Wenn ich eines der Objekteaus meiner Schule entferne (sagen wir, indem wir seine Eigenschaft = nil machen oder indem ich meine Eigenschaft auf ein neues Objekt umstelle), wird seine Book korrekt freigegeben? Was muss ich tun, um sicherzustellen, dass dies der Fall ist? Muss ich self.myBook = nil in einer dealloc Methode schreiben? Was, wenn Child ein View-Controller wäre, müsste ich self.myBook = nil in der viewDidUnload-Methode schreiben?

Ich ziele nur auf iOS 5 (und höher), so dass die alte Art der Speicherverwaltung nicht wirklich wichtig für mich ist.

+0

Ich empfehle Ihnen, dies zu lesen: http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

Vielen Dank für den Vorschlag. Ich werde es mir ansehen. – Nosrettap

Antwort

5

Wenn ich eine der Child Objekte aus meiner Schule zu entfernen (etwa, indem sie sein property = nil oder durch mein Eigentum Wechsel zu einem neuen Objekt Punkt), wird seine Book ordnungsgemäß freigegeben werden?

Ja, es wird freigegeben, solange es keine anderen starken Verweise darauf gibt.

Was muss ich tun, um sicherzustellen, dass dies der Fall ist?

Nichts Besonderes: ARC wird Zählung Referenzobjekts dekrementiert, wenn Sie den Verweis auf dieses Objekt zu nil gesetzt, dass das Objekt nicht mehr Bezug genommen wird, und geht sie zu löschen. Es ist intelligent genug, um mit den Objekten umzugehen, auf die referenziert vom gelöschten Objekt verwiesen wird, so dass Sie keinen Speicher verlieren.

Eine Sache, die Sie zu befürchten ist zirkuläre Referenzen: Wenn Ihre Book einen starken Rückverweis auf Child hat, entweder zu machen, dass der Bezug weak, oder deaktivieren Sie es zur gleichen Zeit, wie Sie setzen Ihre Referenz von Book-nil (Die zweite Option ist fehleranfällig und wird daher nicht empfohlen).

+0

Würdest du dann sagen, dass die "schwachen Eigenschaften" zum größten Teil nur für Steckdosen und zur Vermeidung von zirkulären Abhängigkeiten verwendet werden? – Nosrettap

+0

@Nosrettap Vermeidung von Zirkelverweisen und gewissermaßen Caching sind die beiden "Umbrella Cases", die die Verwendung schwacher Eigenschaften abdecken. Ein wichtiger Spezialfall, der gesondert erwähnt werden sollte, sind Eigenschaften, die Delegaten darstellen: Mit Ausnahme von CAAnimation sind alle Delegierteneigenschaften schwach, um das Erstellen von Aufbewahrungszyklen zu vermeiden. – dasblinkenlight

+0

Wenn es einen Referenzzyklus gibt, kann er nicht in 'dealloc' gelöscht werden, da dealloc nie aufgerufen wird! (Es sei denn, es ist die Dealloc-Methode einer Methode, die beide Elemente des Zyklus besitzt) –

Verwandte Themen