478 Stimmen

Was bedeutet das Schlüsselwort "__block"?

Was genau bedeutet das __block Schlüsselwort in Objective-C? Ich weiß, dass es Ihnen ermöglicht, Variablen innerhalb von Blöcken zu ändern, aber ich möchte wissen...

  1. Was genau sagt es dem Compiler?
  2. Macht es noch etwas anderes?
  3. Wenn das alles ist, was es tut, warum wird es überhaupt benötigt?
  4. Steht es irgendwo in den Dokumenten? (Ich kann es nicht finden).

3 Stimmen

Überprüfen Sie hier und den Abschnitt "Blöcke und Variablen".

1 Stimmen

0 Stimmen

@Vincent danke, ich habe diesen Abschnitt vergessen! Ich werde es mir ansehen.

3voto

Anurag Bhakuni Punkte 2281

Hoffe, das wird dir helfen

Annehmen, wir haben einen Code wie:

{
     int stackVariable = 1;

     blockName = ^()
     {
      stackVariable++;
     }
}

Es wird einen Fehler wie "Variable ist nicht zuweisbar" geben, da die Stack-Variable innerhalb des Blocks standardmäßig unveränderlich sind.

Durch das Hinzufügen von __block (Speichermodifikator) vor der Deklaration wird es im Block veränderlich, d.h. __block int stackVariable = 1;

2voto

Martin Gordon Punkte 36034

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.

0 Stimmen

Deine Links sind beide tot

0 Stimmen

Das ist nicht wirklich eine Antwort und könnte ausführlicher beschrieben oder entfernt werden. Vielen Dank!

0voto

Rich Allen Punkte 59

Dies bedeutet, dass die Variable, zu der es ein Präfix ist, innerhalb eines Blocks verwendet werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X