Was Sie wissen sollten über die tödlichen behalten Zyklus wissen für iOS App-Entwicklung

ARC funktioniert sehr gut, außer in einem Umstand Speicher für Ihren iOS-App zu verwalten. Sie müssen verstehen, wie dieser Umstand entstehen können, und was Sie tun müssen, um es zu verhindern, geschieht.

Wenn Sie ein Objekt erstellen, macht der Compiler sicher, dass das Eigentum übertragen wird, und alles ist gut. Der Compiler Release, das Objekt, wenn es außerhalb des Bereichs geht, also wenn es eine Instanz-Variable ist, wird es im Rahmen bleiben, bis das Objekt selbst freigegeben wird.

Sie gehen durch diesen Prozess gehen, um ein kleines Programm namens RetainCycle.

Erstelle eine neue RetainIt Objekt in der viewDidLoad Methode Ihrer RetainCycleViewController Objekt. Er wird nur freigegeben, wenn der retainIt Variable geht out of scope (es ist __stark Standard). In diesem Fall wird es freigegeben und dann freigegeben (unter der Annahme, dass kein anderes Objektbesitz nimmt) am Ende viewDidLoad weil das retainIt Variable außerhalb des Bereichs:

- (Void) viewDidLoad {[super viewDidLoad] - RetainIt * retainIt = [[RetainIt neu] init] -}

Aber wenn man das schaffen RetainIt Objekt, in der RetainIt Klasse Initialisierungsmethode, drin,Sie erstellen Zyklus Objekt und weisen Sie auf die Zyklus Instanzvariable Sie erklärt. Wie zu erwarten, die Zyklus Objekt wird, bis die beibehalten werden RetainIt Objekt wird aufgehoben, weil sie von einer Instanzvariablen verwiesen ist, die im Rahmen bleibt, bis das Objekt freigegeben wird:

- (Id) init {self = [super init] - if (Selbst-) {self.cycle = [[Zyklus neu] init] - cycle.retainIt = Selbst} return Selbst}

auch Sie, weisen jedoch auf die Zyklus Objekt retainIt Eigenschaft eine Referenz auf die RetainIt Objekt. Das Zyklus Klasse sieht wie folgt aus:

@interface Zyklus: NSObject @ Eigenschaft (stark, nonatomic) RetainIt * retainIt - d

Dies bedeutet, dass die RetainIt Objekt wird erst die Zuordnung aufgehoben werden Zyklus Objekt wird aufgehoben, und dieZyklus Objekt wird nur, wenn die Zuordnung aufgehoben werden RetainIt Objekt wird freigegeben. Hoppla!

Obwohl in diesem Beispiel ein wenig künstlich erscheinen mag, kann sie im wirklichen Leben tatsächlich auftreten, wenn man ein Objekt mit einem Rück Zeiger auf das Objekt haben, die sie (entweder direkt oder durch eine Kette von anderen Objekten, die jeweils mit einem schafft stark Bezug auf die nächste führende zurück zum Anfang).

bild0.jpg

Das __schwach Lebensdauer Qualifikation für Objekte kümmern dies. Die Lösung ist, die Lebensdauer, Qualifier zurück Zeiger zu machen __schwach.

@property (schwach, nonatomic) RetainIt * retainIt-

Menü