Ich lese die Dokumentation von Xcode und hier ist etwas, das mich verwirrt:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
Folgendes wird aus der Dokumentation kopiert:
Ein Block bildet einen starken Verweis auf Variablen, die er erfasst. Wenn Sie
self
innerhalb eines Blocks verwenden, bildet der Block eine starke Referenz aufself
. Wenn alsoself
auch eine starke Referenz auf den Block vorhanden ist (was normalerweise der Fall ist), ergibt sich ein starker Referenzzyklus. Um den Zyklus zu vermeiden, müssen Sie einen schwachen (oder__block
) Verweis auf sich selbst außerhalb des Blocks erstellen , wie im obigen Beispiel.
Ich verstehe nicht, was "schwach (oder __block
)" bedeutet.
Ist
__block typeof(self) tmpSelf = self;
und
__weak typeof(self) tmpSelf = self;
genau das gleiche hier?
Ich habe ein weiteres Stück im Dokument gefunden:
Hinweis: Wenn Sie in einer Speicherbereinigungsumgebung sowohl
__weak
als auch__block
Modifikatoren auf eine Variable anwenden , stellt der Block nicht sicher, dass sie am Leben bleibt.
Also bin ich total verwirrt.
__block _weak NSString *strEg;
?Apple Docs
quelle
Neben anderen Antworten zu
__block
vs__weak
gibt es eine andere Möglichkeit, den Beibehaltungszyklus in Ihrem Szenario zu vermeiden.@weakify(self); [self methodThatTakesABlock:^ { @strongify(self); [self doSomething]; }];
Weitere Informationen zu @Weakify @Strongify Macro
quelle
Wenn Sie self in block verwenden, sollten Sie __weak und nicht __block verwenden, da dies möglicherweise self beibehält .
Wenn Sie ein starkes Selbst brauchen, können Sie Folgendes verwenden:
__weak typeof(self) *weakSelf = self; [self methodThatTakesABlock:^{ if (weakSelf) { __strong typeof(self) *strongSelf = weakSelf; [strongSelf doSomething]; } }];
quelle