2010-04-07 4 views
0

Cela fait 4 heures que je me gratte la tête en essayant toutes sortes de petites expériences, mais je n'arrive pas à comprendre ce qui ne va pas. Serait-ce un bug de compilateur?Avertissement du compilateur lors du passage de NSError ** comme paramètre de méthode

Test.m:

- (id)initWithContentsOfURL:(NSURL *)aURL error:(NSError **)error 
{ 
    if (!(self = [super init])) { 
     return nil; 
    } 
    return self; 
} 

main.m:

NSError *error; 

Test *t = [[Test alloc] initWithContentsOfURL:[NSURL fileURLWithPath:@"/"] error:&error]; 

est ici le compilateur d'avertissement (de main.m):

warning: incompatible Objective-C types 'struct NSError **', expected 'struct NSDictionary **' when passing argument 2 of 'initWithContentsOfURL:error:' from distinct Objective-C type

J'utilise la dernière versions de Xcode et Snow Leopard.

Répondre

5

Je suppose qu'il s'agit d'une instance différente du sélecteur, initWithContentsOfURL:error: - peut-être celle de NSAppleScript. Rappelez-vous que [NSObject alloc] renvoie un id.

Votre code fonctionne-t-il comme prévu lors de l'exécution? Essayez le retour de [Test alloc] à Test*.

à savoir


Test *t = [(Test*)[Test alloc] initWithContentsOfURL:[NSURL fileURLWithPath:@"/"] error:&error]; 
+3

Vous avez raison. Objective-C n'aime pas que les méthodes ayant la même signature aient des types différents (c'est-à-dire qu'elles ne surchargent pas), donc évitez de nommer deux méthodes de la même façon si elles prennent des paramètres différents. –

+0

C'était tout! Merci! Je n'avais aucune idée d'Objective-C pourrait rencontrer ces problèmes de pollution de l'espace de noms. On pourrait penser qu'Apple aurait abordé cela dans Objective-C 2.0 ... – splicer

+1

Oui, c'est un mauvais. J'ai été mordu par cela il y a un moment: http://stackoverflow.com/questions/312608/why-do-i-nene-to-cast-self-to-id – philsquared

Questions connexes