0

Wenn Sie eine Instanz einer Klasse erstellen, die einen Block enthält, zeigt sie auf diesen Block als starke Referenz, und wenn Sie auf das Objekt von diesem Block verweisen, zeigt es auf das Objekt mit einer starken Referenz, wodurch eine starke Referenz erstellt wird Zyklus.Blöcke und Objekte mit starkem Referenzzyklus?

Also, wenn ich dies tun würde:

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    NSLog(@"%@", weakSelf); 
} 

So, jetzt der Block eine schwache Referenz auf das Objekt, aber angeblich ist es empfehlenswert, einen starken lokalen Bezug auf mich selbst innerhalb des Blockes zu erstellen, falls Das Objekt, auf das selbst verweist, wird freigegeben.

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    Employee *innerSelf = weakSelf; 
    NSLog(@"%@", innerSelf); 
} 

Ich wollte ganz genau wissen und machen, dass ich das richtig verstehe, so zog ich ein Bild von dem, was ich denke, geschieht (wenn ich mich irre, bitte korrigieren Sie mich): enter image description here

Or ist das korrekt: enter image description here

Eine korrigierte visuelle würde sehr geschätzt werden.

Antwort

0

Keine von denen sind richtig.

Hier sind nur zwei Objekte. Ein Employee Objekt. Und ein Block. Das ist es.

Sie zeigen nicht, was myBlock wie erklärt wird, aber unter der Annahme, dass es eine Instanzvariable von Employee ist, dann ja, von dieser Zuordnung, die Employee Objekt hat einen starken Bezug auf den Block.

Der Block hat einen schwachen Hinweis auf die Employee Objekt, weil es die lokale Variable weakSelf aus dem umgebenden Rahmen erfasst, und durch Erfassen, macht es eine implizite „Instanzvariable“ in dem Block, die die gleichen Speicherverwaltungseigenschaften aufweist als die gefangene Variable (in diesem Fall schwach).

Die strongSelf innerhalb des Blocks ist nicht relevant. Es ist nur eine lokale Variable. Lokale Variablen sind keine Instanzvariablen und sind daher nicht Teil eines Objekts, das auf ein anderes Objekt verweist. Lokale Variablen leben nur für die Dauer eines bestimmten Aufrufs der Funktion. Sie verursachen keine Zyklen.

Der Grund für innerSelf war so, dass das Objekt wies auf (von weakSelf, die die gleiche Aufgabe wird durch self und innerSelf zeigte auf) wird in der Mitte der Funktion nicht freigegeben. Dies ist nur ein Problem, wenn Sie weakSelf mehrfach in der Funktion verwenden und sich darauf verlassen, dass die Zustände dieser Zeiten konsistent sind. Wenn Sie innerSelf verwenden, wird es konsistent auf ein vorhandenes Objekt oder konsistent nil zeigen. Da Sie hier nur einmal weakSelf verwenden, ist es nicht nötig.