Angenommen, ich erschaffe bereits ein schwaches Selbst mit
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
...
}];
In diesem Block, wenn ich einen anderen Block verschachtele:
[weakSelf doAnotherBlockOperation:^{
[weakSelf doSomething];
}
wird es einen Retain-Zyklus schaffen? Muss ich einen weiteren schwachen Verweis auf das weakSelf erstellen?
__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
[weakerSelf doSomething];
}
Es hängt davon ab, ob.
Sie erstellen einen Aufbewahrungszyklus nur, wenn Sie den Block tatsächlich speichern (weil self
auf den Block und block auf self
verweist). Wenn Sie keinen der Blöcke speichern möchten, reicht es aus, den starken Verweis auf self
zu verwenden. --- Der Block wird zuerst freigegeben, nachdem er ausgeführt wurde, und anschließend wird sein Zeiger auf self
freigegeben.
In Ihrem speziellen Beispiel müssen Sie keine weakerWeakerEvenWeakerSelfs erstellen, es sei denn, Sie führen mehr Operationen aus, die nicht angezeigt werden.
Ihr Code funktioniert einwandfrei: Die schwache Referenz führt nicht zu einem Beibehaltungszyklus, da Sie ARC explizit anweisen, den Beibehaltungszähler Ihres schwachen Objekts nicht zu erhöhen. Für eine optimale Vorgehensweise sollten Sie jedoch eine starke Referenz Ihres Objekts mit der schwachen Referenz erstellen. Hierdurch wird auch kein Aufbewahrungszyklus erstellt, da der starke Zeiger innerhalb des Blocks nur bis zum Abschluss des Blocks vorhanden ist (der einzige Gültigkeitsbereich ist der Block selbst).
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
...
}
}];