2013-02-08 5 views
1

Je suis habitué à l'aide de cette macro pour initialiser NSError** arguments:initialisation NSError macro a cessé de travailler avec Clang récente

#define INIT_ERROR_IF_NULL(error) error = error ? error : &(NSError*){ nil } 

Ce contrôle le passé l'argument NSError** et si elle est NULL, initialise à un NSError factice pour que je ne pas devoir envelopper chaque déréférencement *error dans un conditionnel. Dans le code, cette version:

- (void) doFoo: (NSError**) error 
{ 
    if (error) { 
     *error = [NSError …]; 
    } 
} 

... se transforme en ceci:

- (void) doFoo: (NSError**) error 
{ 
    INIT_ERROR_IF_NULL(error); 
    *error = [NSError …]; 
} 

J'aime l'approche, il sauve la ramification et me fait écrire moins de code (bien sûr, je ne prends pas la peine lorsque le error est utilisé une seule fois). Le problème est qu'il a cessé de travailler dans la dernière version Clang, comme le compilateur se plaint de non-concordance de type pointeur:

Pointer type mismatch ('NSError *__autoreleasing *' and 'NSError **') 

Si je change la macro pour lancer explicitement l'objet anonyme résultant de NSError *__autoreleasing* (les signatures de type deviennent ridicules), le compilateur se plaint en outre, sur une autre ligne:

Casting 'NSError **' to type 'NSError *__autoreleasing *' changes retain/release properties of pointer 

Encore une fois, la variable en question est un argument de la méthode. Je ne comprends pas le problème. Que puis-je faire pour garder ma macro?

Répondre

2

Cette compile sans erreurs/avertissements:

#define INIT_ERROR_IF_NULL(error) error = error ? error : &(NSError __autoreleasing *){ nil } 
+0

D-oh, je suis un idiot, trop d'étoiles pour moi. Merci! – zoul

Questions connexes