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?
D-oh, je suis un idiot, trop d'étoiles pour moi. Merci! – zoul