Ich habe nie auf nicht ARC-basierten Projekt gearbeitet. Ich bin auf meinem ARC-basierten Projekt auf einen Zombie gestoßen. Ich frage mich, was war ein Retain-Zyklus.KannBehalten Zyklus in ARC
Könnten Sie mir ein Beispiel für Retain-Zyklus geben?
Ich habe nie auf nicht ARC-basierten Projekt gearbeitet. Ich bin auf meinem ARC-basierten Projekt auf einen Zombie gestoßen. Ich frage mich, was war ein Retain-Zyklus.KannBehalten Zyklus in ARC
Könnten Sie mir ein Beispiel für Retain-Zyklus geben?
A behalten Zyklus eine Situation ist, wenn das Objekt A
B
Objekt behält, und das Objekt B
behält das Objekt A
gleichzeitig *. Hier ein Beispiel:
@class Child;
@interface Parent : NSObject {
Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
Parent *parent;
}
@end
Sie können fix ein Zyklus in ARC behalten, indem Sie __weak
Variablen oder weak
Eigenschaften für Ihre „Backlinks“, dh Links oder indirekt Eltern in einer Objekthierarchie zu richten:
@class Child;
@interface Parent : NSObject {
Child *child;
}
@end
@interface Child : NSObject {
__weak Parent *parent;
}
@end
Führt der Retain-Zyklus zu Speicherverlust in ARC? – Raj
@Raj Absolut! Retain-Zyklen sind nicht ARC-spezifisch, sie verursachen Speicherlecks in ARC- und Nicht-ARC-Szenarien. – dasblinkenlight
Wir könnten vermeiden, dass sie Speicherlecks verursachen, wie ich in den Kommentaren zu @ Simon_Germains Antwort erklärt habe. – trss
Hier ist ein Aufbewahrungszyklus: Wenn zwei Objekte einen Bezug zueinander behalten und beibehalten werden, wird ein Aufbewahrungszyklus erstellt, da beide Objekte versuchen, sich gegenseitig zu behalten, so dass sie nicht freigegeben werden können.
@class classB;
@interface classA
@property (nonatomic, strong) classB *b;
@end
@class classA;
@interface classB
@property (nonatomic, strong) classA *a;
@end
zu vermeiden Um Zyklen mit ARC behalten, einfach erklärt einen von ihnen mit einem weak
Bezug, etwa so:
@property (nonatomic, weak) classA *a;
Unmöglich zu veröffentlichen? Es könnte losgelassen werden, wenn wir sorgfältig darauf achten, ein anderes Objekt für eine dieser Eigenschaften neu zuzuweisen, um die Kette zu brechen, richtig? Ich frage speziell, weil ich gehört habe, dass es unmöglich ist, viele Male zu veröffentlichen. – trss
Die Überschrift "Vermeiden von Retain Cycles Regel Nr. 4: verwenden Sie" schließen "Methoden, um Zyklen zu brechen" http://www.cocoaithloth.com/2009/07/rules-to-avoid-retain-cycles.html scheint dies zu bestätigen Es ist möglich, Aufbewahrungszyklen zu unterbrechen. Es ist definitiv besser zu vermeiden, aber wo es sonst Komplexität schafft, könnte es immer noch verwendet werden, aber vorsichtig, um es zu brechen, bevor es ein Speicherleck erzeugt, wodurch das Leck vermieden wird. – trss
Unmöglich könnte ein bisschen übertrieben sein, aber lassen Sie uns einfach sagen, dass es nicht gerade trivial ist. Nichts ist unmöglich. –
Dies ist schnell, aber hier ist eine interaktive Demo von behalten Zyklen in iOS: https://github.com/nickm01/RetainCycleLoggerExample
Ein Zombie wegen eines Zyklus beibehalten nicht auftritt. – bbum