Aus dem Block-Sprachspezifikation:
Zusätzlich zum neuen Blocktyp führen wir auch einen neuen Speicherqualifikator, __block, für lokale Variablen ein. [testme: eine __block-Deklaration innerhalb einer Block-Literalität] Der Speicherqualifikator __block ist gegenseitig ausschließend zu den bestehenden lokalen Speicherqualifikatoren auto, register und static. [testme] Variablen, die mit __block qualifiziert sind, verhalten sich so, als ob sie in allokiertem Speicher wären, und dieser Speicher wird automatisch nach der letzten Verwendung der Variablen wiederhergestellt. Eine Implementierung kann eine Optimierung wählen, bei der der Speicher anfänglich automatisch ist und nur bei einem Block_copy eines referenzierenden Blocks in allokierten (Heap-)Speicher "verschoben" wird. Solche Variablen können wie normale Variablen geändert werden.
Im Fall, dass eine __block-Variable ein Block ist, muss man davon ausgehen, dass die __block-Variable in allokiertem Speicher liegt und daher angenommen wird, dass sie auf einen Block verweist, der auch in allokiertem Speicher liegt (dass es das Ergebnis einer Block_copy-Operation ist). Trotzdem gibt es keine Bestimmung für ein Block_copy oder ein Block_release, wenn eine Implementierung anfänglichen automatischen Speicher für Blöcke bereitstellt. Dies liegt an dem inhärenten Wettlaufzustand potenziell mehrerer Threads, die versuchen, die gemeinsame Variable zu aktualisieren, und an der Notwendigkeit zur Synchronisierung bei der Entsorgung älterer Werte und beim Kopieren neuer Werte. Eine solche Synchronisierung fällt nicht in den Rahmen dieser Sprachspezifikation.
Weitere Details dazu, wie eine __block-Variable kompiliert werden sollte, finden sich in der Block-Implementierungsspezifikation, Abschnitt 2.3.
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).