Wann und wann nicht __block in Objective-C verwenden? [geschlossen]

8

Warum brauchen Sie bei der Verwendung von Blöcken __block für einige Variablen, und für andere Variablen wie Funktionsparameter nicht?

    
Josh Sklar 07.02.2013, 19:05
quelle

2 Antworten

23

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 nicht das Objekt selbst), und wenn es ein Objekt ist, behält es es.

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.

    
Catfish_Man 07.02.2013 19:13
quelle
14

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!

    
Chris C 07.02.2013 19:13
quelle