2012-07-09 6 views
8

Ich sehe einige der Beispielcode für die Square Cam in Apple's sample code. Ich möchte einige Funktionen in einem modernen Projekt mit ARC replizieren. Allerdings gibt es eine Tonne erfordern Aussagen wie:Wie behandeln Sie "require (..., bail)" -Aussagen mit ARC?

BOOL success = (destination != NULL); 
require(success, bail); 

, die den Compiler-Fehler erzeugt:

Goto into protected scope.

Meine Frage ist - was der richtige Weg ist, solche Aussagen in einem Projekt zu handhaben mit BOGEN?

+0

Noch eine Anmerkung - dachte ich über einfach den Controller das Markieren von ARC nicht zu nutzen, aber das ist nicht ideal wäre wäre schwierig, in der Datei als arbeiten. Das Markieren von Bibliotheken von Drittanbietern, um ARC nicht zu verwenden, ist in Ordnung, aber wenn es Teil der Projektimplementierung ist, würde es einen schlechten Arbeitsablauf erzeugen, da XCode Compilerfehler/Warnungen noch generiert, während Sie die Datei geöffnet haben. Es wäre unmöglich, tatsächliche Warnungen oder Fehler während der Arbeit im Quellcode für den gegebenen Controller zu sehen. –

+0

Ich bekomme keinen solchen Fehler. Wo ist deine "Kaution" -Linie? Oder verwenden Sie den Beispielcode so wie er ist? – borrrden

+0

Gibt es einen Grund, warum Leute meine Frage abstimmen? –

Antwort

10

Ich hatte das gleiche Problem (mit dem gleichen Beispielcode). Der Code sah wie folgt aus:

BOOL success = (destination != NULL); 
require(success, bail); 

//Initialise some variables 

bail: 
//Deal with errors 

Ich habe Klammern um den Block mit den Erklärungen ihrer Reichweite deutlich zu machen:

BOOL success = (destination != NULL); 
require(success, bail); 
{ 
    // *** Initialise some variables *** 
} 
bail: 
{ 
    //Deal with errors 
} 

Und es löste das Problem für mich. Wenn ich mir das anschaue, habe ich auch gelernt, dass man Buildfehler manchmal erweitern kann, um mehr Details zu erhalten.

+0

Schöne Antwort +1. Das Hinzufügen von geschweiften Klammern zum Definieren des Umfangs ist eine großartige Lösung. Die meisten Antworten sagen, nicht unter goto erklären, aber man kann mit richtigen Klammern. – braden

3

Anscheinend bail ist in einem Bereich mit einer oder mehreren __block Variablen; Das ist nicht erlaubt. Siehe http://clang.llvm.org/compatibility.html#blocks-in-protected-scope für mehr. Die dort vorgeschlagene Lösung soll den Gültigkeitsbereich der Variablen __block begrenzen, indem sie in durch Klammern getrennte Blöcke gesetzt werden. Dies funktioniert möglicherweise nicht immer. YMMV.

0

Ich füge eine Beschreibung für @ Lewis42 Antwort.

Wenn Sie Variablen nicht in ihren eigenen Bereich legen, umgehen Sie die Initialisierung aller Variablen nach Goto, und wenn ARC versucht, es zu bereinigen, wird es am Ende versuchen, ein zufälliges Bit Speicher freizugeben.

Wenn Sie keine Variablen in ihren eigenen Geltungsbereich setzen möchten, stellen Sie sicher, dass keine Variable unter goto keyword deklariert werden sollte.

Jumps to within __block variable scope

__block require special runtime initialization. A jump into the scope of a __block variable bypasses this initialization, leaving the variable's metadata in an invalid state.