ARC, self und blockt

8

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;

verwende

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:

  • Ich tricke nur den Compiler?
  • Was macht eine starke Bezugnahme auf eine schwache Referenz?
  • alles andere, was mir fehlt.

Danke.

    
cream-corn 12.03.2014, 00:20
quelle

3 Antworten

8
  

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".

    
Aaron Brager 12.03.2014, 00:26
quelle
3

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.

    
Merlevede 12.03.2014 00:25
quelle
3

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.

    
Avt 12.03.2014 00:30
quelle