Warum brauchen Sie bei der Verwendung von Blöcken __block für einige Variablen, und für andere Variablen wie Funktionsparameter nicht?
Die Frage ist wirklich falsch formuliert. Es ist nicht "wann brauche ich __block?", Es ist "was macht __block?". Sobald Sie verstehen, was es tut, können Sie sagen, wann Sie es brauchen.
Wenn ein Block eine Variable erfasst (die Erfassung erfolgt, wenn ein Block auf eine Variable außerhalb von ihm verweist), erstellt er normalerweise eine Kopie der Variablen (beachten Sie, dass er bei Objekten eine Kopie des -Zeigers
Dies bedeutet, dass Sie mit dem normalen Verhalten keinen Block verwenden können, um einen Wert außerhalb des Blocks zu ändern. Dieser Code ist ungültig, zum Beispiel:
%Vor%Der __block-Qualifizierer führt zwei Änderungen durch: Am wichtigsten ist, dass er dem Compiler sagt, dass der Block ihn direkt erfassen soll, anstatt eine Kopie zu erstellen. Das bedeutet, dass Sie den Wert von Variablen außerhalb des Blocks aktualisieren können. Weniger wichtig, aber immer noch sehr relevant, wenn ARC nicht verwendet wird, wird der Compiler angewiesen, erfasste Objekte nicht zu behalten.
Ein Codeblock hat Zugriff auf alle Variablen, die innerhalb des Gültigkeitsbereichs liegen, in dem der Block deklariert wurde. Jede Variable / jedes Objekt, das außerhalb des Bereichs des Blocks deklariert wird, ist jedoch innerhalb des Blocks unveränderlich. Sie können es lesen, aber nicht ändern. Wenn das Flag __block in der Deklaration des Objekts gesetzt wird, kann es innerhalb des Bereichs des Blocks geändert werden.
EDIT: Hier ist ein Beispiel:
%Vor%Dies funktioniert nicht und Sie erhalten eine Fehlermeldung.
%Vor%Problem gelöst!
Tags und Links objective-c ios objective-c-blocks