2012-07-09 11 views
8

Estoy buscando a través del código de ejemplo para el Square Cam in Apple's sample code. Quiero replicar parte de su funcionalidad en un proyecto moderno usando ARC. Sin embargo, hay un montón de establecer que los estados tales como:¿Cómo se manejan las declaraciones 'require (..., fianza)' con ARC?

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

que genera el error del compilador:

Goto into protected scope.

Mi pregunta es - ¿cuál es la forma adecuada para manejar este tipo de declaraciones en un proyecto utilizando ¿ARCO?

+0

Una nota más - pensé en simplemente marcar el controlador no utilizar ARC, pero esto no sería ideal, ya que trabaja en el archivo sería difícil. Marcar bibliotecas de terceros para que no utilicen ARC está bien, pero si es parte de la implementación del proyecto, creará un flujo de trabajo deficiente ya que XCode aún genera errores/advertencias del compilador mientras tiene el archivo abierto. Sería imposible ver advertencias reales o errores mientras se trabaja en el código fuente para el controlador dado. –

+0

No recibo tal error. ¿Dónde está tu línea de "fianza"? ¿O estás usando el código de muestra como está? – borrrden

+0

¿Hay algún motivo por el que las personas no quieran votar mi pregunta? –

Respuesta

10

Tuve el mismo problema (con el mismo código de muestra). El código se veía así:

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

//Initialise some variables 

bail: 
//Deal with errors 

que añade llaves alrededor de la manzana con las declaraciones para que su alcance claro:

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

Y resolvió el problema para mí. Al observar esto también aprendí que a veces puedes expandir los errores de compilación para obtener más detalles.

+0

Bonita respuesta +1. Solo agregar llaves para definir el alcance es una gran solución. La mayoría de las respuestas dicen que no se declare a continuación, pero se puede con las llaves adecuadas. – braden

0

Estoy agregando algunas descripciones para @ Lewis42 respuesta.

Si no coloca la variable en su propio ámbito, omite la inicialización de todas las variables después de goto, y cuando ARC intente limpiarla, terminará tratando de liberar algún bit aleatorio de memoria.

Si no quiere poner las variables en su propio ámbito, asegúrese de que ninguna variable deba declararse debajo de la palabra clave ir.

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.

Cuestiones relacionadas