webentwicklung-frage-antwort-db.com.de

Bezug auf das schwache Selbst in einem verschachtelten Block

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];
    }
39
Enzo Tran

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.

19

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) {
        ...
    }
}];
60