Was ist der Unterschied zwischen einer __weak- und einer __block-Referenz?
Bin ich beim Lesen Xcode-Dokumentation, und hier ist etwas, das mich verwirrt:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
Folgende ist kopiert aus der Dokumentation:
Einen block bildet einen starken Bezug zur Variablen erfasst. Wenn Sie
self
innerhalb eines Blockes, den block bildet einen starken Bezug zurself
so dass, wenn
self
hat auch einen starken Bezug auf den block (die es in der Regel
es tut), eine starke Referenz-Zyklus ergibt. Um zu vermeiden, den Zyklus, die Sie benötigen
zum erstellen einer schwachen (oder__block
) Verweis auf sich selbst außerhalb des Blocks, so wie
in dem Beispiel oben.
Ich verstehe nicht, was bedeutet "eine schwache (oder __block
)" gemeint?
Ist
__block typeof(self) tmpSelf = self;
und
__weak typeof(self) tmpSelf = self;
genau das gleiche hier?
Fand ich ein weiteres Stück in das Dokument:
Hinweis: In ein garbage Collection-Umgebung, wenn Sie gelten sowohl
__weak
und
__block
Modifikatoren auf eine variable, dann wird der block nicht sicher, dass es am Leben gehalten wird.
So, ich bin Total verwirrt.
InformationsquelleAutor der Frage HanXu | 2012-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der docs über __block
Aus der docs über __schwach
So sind Sie technisch verschiedene Dinge. __block zu stoppen-variable kopiert wird, von Ihrem äußeren Umfang in dem block scope. __schwach ist eine sich selbst begrenzende schwach Zeiger.
Beachten Sie, ich sagte technisch, da für Ihren Fall, den Sie tun (fast) das gleiche. Der einzige Unterschied ist, wenn man mit der ARC oder nicht. Wenn Ihr Projekt verwendet ARC und ist nur für iOS4.3 und oben, mit __schwach. Es stellt die Referenz festgelegt ist nil, wenn der Globale Bereich als Referenz-releases irgendwie. Wenn Ihr Projekt nicht mit BOGEN oder ist für ältere OS-Versionen verwenden __block.
Gibt es einen kleinen Unterschied hier ist, stellen Sie sicher, dass Sie es verstehen.
EDIT: ein Weiteres Stück des Puzzles ist __unsafe_unretained. Dieser Modifikator ist fast das gleiche wie __schwach, aber für die pre 4.3 runtime-Umgebungen. JEDOCH, es ist nicht auf null und lässt Sie mit hängenden Zeigern.
InformationsquelleAutor der Antwort Paul de Lange
apple-docs
InformationsquelleAutor der Antwort Andrei Shender
Neben anderen Antworten auf __ - block vs __schwach, es ist ein weiterer Weg, um zu vermeiden, behalten Kreislauf in Ihrem Szenario.
Mehr Infos über @Weakify @Strongify Marco
InformationsquelleAutor der Antwort Jun Jie Gan