2011-10-18 13 views
28

Al actualizar parte de mi código para que sea compatible con iOS 5 SDK, intenté refactorizar mi código utilizando "Convertir a objetivo- C ARC "en Xcode y recibió un error. El error ocurre en una variable de instancia en mi archivo .hCuenta de referencia automática: Puntero a tipo no const 'NSError *' sin propiedad explícita

NSError **_error; 

El error dice "Puntero al tipo no const 'NSError *' sin la propiedad explícita." ¿Cómo puedo arreglar esto?

+0

Esta pregunta (ver http://stackoverflow.com/questions/6907726/setting-nserror-within-a-block-using-arc) es lo más parecido que puedo encontrar sobre el tema. – Ziminji

+1

¿Por qué está utilizando doble indirección en una variable de instancia? Solo debe necesitar eso para los parámetros del método para que NSErrors pueda pasar una copia de seguridad. –

+0

@BradLarson ok, entonces, ¿cuál es la forma correcta (en ARC) de inicializar una instancia 'NSError' cuando se llama a un método que toma' (NSError **): error' como argumento? – raffian

Respuesta

18

Al almacenar NSError objetos en una variable de instancia que tiene que declarar como un simple puntero:

@interface Foo : NSObject 
{ 
    NSError *_errror; 
} 

NSError ** sólo se utiliza para volver indirectamente NSError objetos de un método para la persona que llama. Es (probablemente) un error almacenarlo en una variable de instancia.

54

Puede utilizar uno de los calificadores de toda la vida que se describen en el Transitioning to ARC Release Notes

Para NSError ** tendrá que utilizar __autoreleasing por lo que el ejemplo proporcionado por Nikolai tendría el siguiente aspecto

@interface Foo : NSObject 
{ 
    NSError * __autoreleasing *error; 
} 

La sintaxis es un poco raro y debes seguir los consejos de Nikolais, pero si estás seguro de que NSError ** es lo que quieres, esto debería funcionar.

+1

Esto no se compila, prueba 'NSError * __autoreleasing * _error;' –

+2

Esta es la respuesta correcta. No está mal hacer esto como dice la respuesta de @NikolaiRuhe. –

+3

¡Gracias por esta respuesta! Me gustaría añadir que también he usado otros calificadores de por vida con esta misma sintaxis, como 'NSArray * __strong * array', etc. –

Cuestiones relacionadas