Ich dachte, ich verstehe die Verwendung von Selbst in einem Block, der kopiert wird, ist ein no no .
Aber in einem Versuch, meinen Code zu säubern, habe ich eine Reihe von Warnungen in Xcode aktiviert, eine namens "Senden von Nachrichten an schwache Zeiger"
Also jetzt in allen meinen Blöcken, jedes Mal wenn ich meine erstellte weakself
Referenz __weak typeof(self) weakself = self;
Ich bekomme diese Warnung: Weak receiver may be unpredictably set to nil
ein triviales Beispiel:
%Vor%Ich habe Antworten gesehen, die eine Version von self innerhalb des Blocks wie folgt definieren:
%Vor%Ich frage mich also, was hier eigentlich passiert:
Danke.
Ich dachte, ich verstehe die Verwendung von Selbst in einem Block ist ein Nein Nein.
Das ist nicht genau richtig. Blöcke behalten die Objekte in ihnen. Verwenden Sie daher nicht self
in einem Block , wenn Ihr Block von self
beibehalten wird.
Sie können zum Beispiel self
in einem UIView-Animationsblock verwenden. Dies liegt daran, dass Ihr Ansichtscontroller (oder welcher Code auch immer die Animation aufruft) keinen Zeiger auf den UIView-Animationsblock hat.)
Täusche ich nur den Compiler?
Nein.
Was macht eine starke Bezugnahme auf eine schwache Referenz?
Wenn die schwache Referenz nicht nil
ist, wird die Retain-Anzahl des Empfängers erhöht. Dadurch wird die Zuweisung des Objekts aufgehoben, während Sie es verwenden.
Erinnern Sie sich, ARC wird die Zuweisung von Objekten rückgängig machen, wenn keine starken Referenzen mehr auf sie vorhanden sind. Wenn Sie eine starke Referenz im Block erstellen, verhindern Sie eine mögliche Aufhebung der Zuordnung, bis Sie damit fertig sind.
alles andere, was mir fehlt.
Ich empfehle das Lesen der Abschnitt Praktische Speicherverwaltung des Advanced Memory Management Programming Guide. Vor allem lesen Sie den Unterabschnitt "Verwenden Sie schwache Referenzen, um Zyklen zu vermeiden".
Denken Sie daran, dass in ARC ein Objekt nicht aufgehoben wird, solange es einen starken Verweis darauf gibt.
Wenn ein Objekt eine schwache Referenz hat, kann die Zuweisung des Objekts aufgehoben werden (wenn keine andere starke Referenz auf dasselbe Objekt vorhanden ist), sodass eine schwache Referenz die Lebensdauer der Objekte nicht gewährleistet.
Indem Sie dies tun:
%Vor% Sie stellen sicher, dass Sie eine starke Referenz auf das Objekt haben, bevor Sie es verwenden ( selfref
ist die starke Referenz, die auf dasselbe Objekt verweist, auf das sich weakself
bezieht). Wenn Sie dies nicht tun, kann das Objekt freigegeben werden, während Sie es verwenden.
Ein starker Verweis auf eine schwache Referenz behält ein Objekt bei. Es könnte im folgenden Fall wichtig sein
%Vor%Wenn schwacher Empfänger unvorhersehbar auf null gesetzt wird (2) Ressourcen konnten erfolgreich in (1) zugewiesen, aber nicht in (3) freigegeben werden. Um solche Probleme zu vermeiden, könnte eine starke Referenz verwendet werden.
%Vor%Wenn nun selbstref nicht in (1) ist, ist es auch in (2) und (3) gültig.
Tags und Links objective-c ios objective-c-blocks automatic-ref-counting retain-cycle