2011-10-18 4 views
28

Nell'aggiornare alcuni dei miei codici per essere compatibili con l'SDK di iOS 5, ho tentato di ridefinire il mio codice utilizzando "Converti in obiettivo- C ARC "in Xcode e ricevuto un errore. L'errore si verifica su una variabile di istanza nel mio file .h.Conteggio di riferimento automatico: puntatore a non-const tipo 'NSError *' senza proprietà esplicita

NSError **_error; 

L'errore indica "Puntatore a non-const tipo 'NSError *' senza proprietà esplicita." Come posso risolvere questo problema?

+0

Questa domanda (vedere http://stackoverflow.com/questions/6907726/setting-nserror-with--a-block-using-arc) è la cosa più vicina che riesco a trovare sull'argomento. – Ziminji

+1

Perché stai usando la doppia indirezione in una variabile di istanza? Dovresti averne bisogno solo per i parametri del metodo, in modo che sia possibile eseguire il backup di NSErrors. –

+0

@BradLarson ok, quindi qual è il modo corretto (in ARC) per inizializzare un'istanza 'NSError' quando si chiama un metodo che accetta' (NSError **): error' come argomento? – raffian

risposta

18

Quando si ripone NSError oggetti in una variabile di istanza si deve dichiarare come un semplice puntatore:

@interface Foo : NSObject 
{ 
    NSError *_errror; 
} 

NSError ** viene utilizzato solo per tornare indirettamente NSError oggetti da un metodo per il chiamante. È (probabilmente) un errore memorizzarlo in una variabile di istanza.

54

È possibile utilizzare una delle qualificazioni a vita descritti nel Transitioning to ARC Release Notes

Per NSError ** usereste __autoreleasing così l'esempio fornito da Nikolai sarebbe quindi simile a questa

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

La sintassi è un po 'strano e dovresti seguire i consigli di Nikolais, ma se sei sicuro che NSError ** è ciò che vuoi, questo dovrebbe funzionare.

+1

Questo non viene compilato, prova 'NSError * __autoreleasing * _error;' –

+2

Questa è la risposta corretta. Non è sbagliato farlo come afferma la risposta di @NikolaiRuhe. –

+3

Grazie per questa risposta! Vorrei aggiungere che ho usato anche altri qualificatori di durata con questa stessa sintassi, come 'NSArray * __strong * array', ecc. –