2012-01-14 10 views
10

Sto lavorando a un progetto che utilizza ARC e ho problemi con un pezzo di codice esistente che avevo già.conversione implicita di un puntatore indiretto a un puntatore dell'obiettivo-c con ARC

Heres il codice:

- (id)initWithError:(NSError **)error 
{ 
    if ((self = [super init])) 
    { 
     errorPointer = error; //Getting error here 
    } 

    return self; 
} 

Im ottenendo un errore che dice:

implicita conversione di un puntatore indiretto per un puntatore Objective-C a 'NSError' non è consentita con ARC.

Cosa devo fare per risolvere questo problema? Ho provato a fare un cast a ponte, ma non ha funzionato. Qualsiasi aiuto è apprezzato.

Oh, e solo per un chiarimento, nel file .h questo è come ho dichiarato l'errorPointer variabile:

NSError * errorPointer;

Grazie!

risposta

9

Dovrebbe essere

errorPointer = *error; // no error here 

Le due variabili differiscono da un livello di indirezione (semplicemente parlando, il numero di stelle nella loro dichiarazione non è lo stesso). È necessario aggiungere uno * davanti allo error per compensare l'extra * dello errorPointer.

+2

Non dovrebbe essere 'errorPointer = * error;'? – UIAdam

+0

@AdamW Assolutamente, sei corretto! Mi sono confuso a causa della denominazione. Grazie! – dasblinkenlight

+0

Grazie mille! questo ha risolto il problema! –

1

errorPointer e errore hanno tipi non corrispondenti.

In base al codice presente, sembra che l'argomento error debba essere dichiarato come NSError *.

+0

Solo per espandere leggermente, l'unico motivo per utilizzare un argomento double indirection ('NSError **') sarebbe se fosse necessario allocare l'errore all'interno del metodo init e renderlo disponibile al chiamante. – UIAdam

+0

Sì, e questo è uno schema comune nei metodi Cocoa. Molti metodi di framework Cocoa restituiscono un errore (se esiste) tramite un argomento 'NSError *' passato per riferimento al metodo. –

+0

@AndrewMadsen Sicuramente ... ma in questo caso non è evidente che lo voglia fare, da qui il mio suggerimento di cambiare semplicemente il tipo dell'argomento. – UIAdam

Problemi correlati