Was genau macht das __block
Schlüsselwort in Objective-C? Ich weiß, dass Sie damit Variablen innerhalb von Blöcken ändern können, aber ich würde gerne wissen ...
- Was genau sagt es dem Compiler?
- Tut es noch etwas?
- Wenn das alles ist, warum wird es dann überhaupt benötigt?
- Ist es irgendwo in den Dokumenten? (Ich kann es nicht finden).
objective-c
ios
objective-c-blocks
mjisrawi
quelle
quelle
__block
.__block
übersetzt werden sollen: „Closures [in Swift] haben eine ähnliche Erfassungssemantik wie Blöcke [in Objective-C], unterscheiden sich jedoch in einer wesentlichen Hinsicht: Variablen sind eher veränderlich als kopierbar. Mit anderen Worten, das Verhalten von __block in Objective-C ist das Standardverhalten für Variablen in Swift. “ Aus Apples Buch: Verwenden von Swift mit Kakao und Objective-C (Swift 2.2).Antworten:
Es teilt dem Compiler mit, dass jede von ihm markierte Variable auf besondere Weise behandelt werden muss, wenn sie in einem Block verwendet wird. Normalerweise werden Variablen und deren Inhalt, die auch in Blöcken verwendet werden, kopiert, sodass Änderungen an diesen Variablen nicht außerhalb des Blocks angezeigt werden. Wenn sie mit markiert sind
__block
, sind die innerhalb des Blocks vorgenommenen Änderungen auch außerhalb des Blocks sichtbar.Ein Beispiel und weitere Informationen finden Sie unter Der __block-Speichertyp in den Themen zur Blockprogrammierung von Apple .
Das wichtige Beispiel ist dieses:
In diesem Beispiel werden beide
localCounter
undlocalCharacter
geändert, bevor der Block aufgerufen wird. Innerhalb des BlockslocalCharacter
wäre jedoch dank des__block
Schlüsselworts nur die Änderung von sichtbar . Umgekehrt kann der Block geändert werden,localCharacter
und diese Änderung ist außerhalb des Blocks sichtbar.quelle
localCounter
, aber es ändert sichlocalCharacter
. Achten Sie auch auf den WertlocalCounter
im Block: Es ist 42, obwohl die Variable erhöht wird, bevor der Block aufgerufen wird, aber nachdem der Block erstellt wurde (dann wurde der Wert "erfasst").@bbum behandelt Blöcke in einem Blog-Beitrag ausführlich und berührt den Speichertyp __block.
In Anwendungsfällen
__block
wird manchmal verwendet, um Aufbewahrungszyklen zu vermeiden, da das Argument nicht beibehalten wird. Ein häufiges Beispiel ist die Verwendung von Selbst.quelle
__weak
in diesem speziellen Fall ausreichen? Es ist vielleicht etwas klarer ...Wenn Sie __block nicht verwenden, kopiert der Block normalerweise die Variable (behält sie bei). Selbst wenn Sie die Variable ändern, hat der Block Zugriff auf das alte Objekt.
In diesen 2 Fällen benötigen Sie __block:
1.Wenn Sie die Variable innerhalb des Blocks ändern möchten und erwarten, dass sie außerhalb sichtbar ist:
2.Wenn Sie die Variable ändern möchten, nachdem Sie den Block deklariert haben und erwarten, dass der Block die Änderung sieht:
quelle
__block ist ein Speicherqualifizierer, der auf zwei Arten verwendet werden kann:
Markiert, dass sich eine Variable in einem Speicher befindet, der vom lexikalischen Bereich der ursprünglichen Variablen und allen in diesem Bereich deklarierten Blöcken gemeinsam genutzt wird. Und clang generiert eine Struktur, um diese Variable darzustellen, und verwendet diese Struktur als Referenz (nicht als Wert).
In MRC kann __block verwendet werden, um zu vermeiden, dass Objektvariablen, die ein Block erfasst, beibehalten werden. Beachten Sie, dass dies bei ARC nicht funktioniert. In ARC sollten Sie stattdessen __weak verwenden.
Ausführliche Informationen finden Sie in Apple Doc .
quelle
__block
ist ein Speichertyp, der verwendet wird, um Variablen im Bereich veränderbar zu machen. Wenn Sie eine Variable mit diesem Bezeichner deklarieren, wird ihre Referenz an Blöcke übergeben, die keine schreibgeschützte Kopie sind. Weitere Informationen finden Sie unter Blockprogrammierung in iOSquelle
hoffe das wird dir helfen
Nehmen wir an, wir haben einen Code wie:
Es wird ein Fehler wie "Variable ist nicht zuweisbar" ausgegeben, da die Stapelvariablen im Block standardmäßig unveränderlich sind.
Durch Hinzufügen von __block (Speichermodifikator) vor der Deklaration wird es innerhalb des Blocks veränderbar, d. h
__block int stackVariable=1;
quelle
Aus der Block Language Spec :
Einzelheiten zu , was eine __block Variable kompilieren sollte, finden Sie in der Block - Implementierung Spec , Abschnitt 2.3.
quelle
Dies bedeutet, dass die Variable, für die es sich um ein Präfix handelt, innerhalb eines Blocks verwendet werden kann.
quelle