5

Ho una funzione che restituisce un oggetto NSError per riferimento:Casting un rendimento NSError ad un CFErrorRef ritorno

NSData *foo(NSData *foo, NSError *__autoreleasing *outError); 

Questa funzione utilizza un'API che prende un puntatore ad immagazzinaggio per un CFErrorRef. Mi piacerebbe solo passare outError direttamente alla funzione sottostante, ma non riesco a capire la combinazione corretta di parole chiave di dichiarazione e parole chiave di cast per far concordare clang con quel piano. Ce n'è uno?

+0

cheat? errore blah ((CFErrorRef *) (void *)); –

+0

... altrimenti è solo un processo in due fasi. Penso che il compilatore sia abbastanza chiaro che ha bisogno che tu faccia una dichiarazione locale. Penso che non possa fare correttamente la contabilità, altrimenti. (CFErrorRef error2; blah (& error2); * error = (__bridge NSError *) error2; - Immagino sia quello che stai cercando di evitare). –

+0

In effetti, preferirei non dover ricondurre l'oggetto errore al chiamante. –

risposta

3

Se si guarda allo clang notes for __autoreleasing, si dice che la magia avviene al momento dell'assegnazione, il che significa che il casting automatico non può essere d'aiuto. È necessario eseguire l'assegnazione utilizzando una variabile temporanea come menzionato nei commenti sul post originale.

0

Prova questo:

NSError + CFErrorRef.h

@interface NSError (CFErrorRef) 

- (CFErrorRef) cferror; 

@end 

NSError + CFErrorRef.m

#import "NSError+CFErrorRef.h" 

@implementation NSError (CFErrorRef) 

- (CFErrorRef) cferror 
{ 
    CFStringRef domain = (CFStringRef) self.domain; 

    CFDictionaryRef userInfo = (__bridge CFDictionaryRef) self.userInfo; 

    return CFErrorCreate(kCFAllocatorDefault, domain, self.code, userInfo); 
} 

@end 

ho scritto un test di piccola unità rapido per verificare tutto convertito finito e sembra funzionare correttamente. Quindi è sufficiente eseguire il seguente selettore sull'oggetto NSError

CFErrorRef e = [error cferror]; 
+1

Non è necessario creare un oggetto CFError da un oggetto NSError, per due motivi: (1) La funzione che sto chiamando restituisce un oggetto CFError. (2) CFError e NSError sono a ponte senza pedaggio, quindi l'oggetto CFError è già un oggetto NSError. Quello che sto cercando è un modo per convincere il compilatore a farmi passare il mio out-pointer NSError all'argomento CFError out-pointer della funzione sottostante senza darmi un errore o farlo fuoriuscire. –

+0

Oh capisco, stavo semplicemente uscendo dall'argomento. Quello è un po 'più difficile da provare in isolamento hehehe – jerrylroberts

Problemi correlati