Es sagt dem Compiler, dass jede Variable, die damit markiert ist, auf besondere Weise behandelt werden muss, wenn sie innerhalb eines Blocks verwendet wird. Normalerweise werden Variablen und deren Inhalte, die auch in Blöcken verwendet werden, kopiert, sodass Änderungen an diesen Variablen außerhalb des Blocks nicht sichtbar sind. Wenn sie mit __block
markiert sind, sind die innerhalb des Blocks vorgenommenen Änderungen auch außerhalb davon sichtbar.
Beispiel und weitere Informationen finden Sie unter Der __block-Speichertyp in Apples Block-Programmierungsthemen.
Das wichtige Beispiel ist dieses:
extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
NSInteger localCounter = 42;
__block char localCharacter;
void (^aBlock)(void) = ^(void) {
++CounterGlobal;
++CounterStatic;
CounterGlobal = localCounter; // localCounter bei Blockerstellung festgelegt
localCharacter = 'a'; // setzt localCharacter im umgebenden Bereich
};
++localCounter; // vom Block nicht gesehen
localCharacter = 'b';
aBlock(); // Block ausführen
// localCharacter jetzt 'a'
}
In diesem Beispiel werden sowohl localCounter
als auch localCharacter
vor dem Aufruf des Blocks geändert. Innerhalb des Blocks wäre jedoch nur die Änderung an localCharacter
sichtbar, dank des __block
Schlüsselworts. Umgekehrt kann der Block localCharacter
ändern und diese Änderung ist außerhalb des Blocks sichtbar.
3 Stimmen
Überprüfen Sie hier und den Abschnitt "Blöcke und Variablen".
1 Stimmen
Möglicher Duplikat von Objective-C Block Syntax - Kann jemand dies erklären?
0 Stimmen
@Vincent danke, ich habe diesen Abschnitt vergessen! Ich werde es mir ansehen.
1 Stimmen
@Code Monkey: Ich habe speziell nach dem Schlüsselwort gefragt, nicht nach der Syntax im Allgemeinen. Also denke nicht, dass es wirklich ein Duplikat ist.
3 Stimmen
@Code Monkey: Nein, das ist kein Duplikat. Die von Ihnen erwähnte Frage erwähnt überhaupt nicht
__block
.3 Stimmen
Und wenn jemand sich fragt, wie
__block
in Objective-C ins Swift übersetzt werden sollte: "Closures [in Swift] haben ähnliche Capture-Semantik wie Blöcke [in Objective-C], unterscheiden sich jedoch in einem entscheidenden Punkt: Variablen sind veränderlich statt kopiert. Mit anderen Worten ist das Verhalten von __block in Objective-C das Standardverhalten für Variablen in Swift." Aus Apples Buch: Swift mit Cocoa und Objective-C verwenden (Swift 2.2).