2010-07-15 9 views
3

Je définis protocole avec un nom de méthode est la suivante:objc: éviter les conflits de nom de méthode de protocole?

- (id)initWithDelegate:(id <Foo>)delegate; 

Alors que dans mon projet, il a également un protocole tiers (en classe différente):

- (id)initWithDelegate:(NSObject *)delegate; 

Dans une autre classe, ce qui importe à la fois protocoles, je viens d'utiliser la deuxième méthode:

id thirdPartyObject = [[ThirdPartyClass alloc] initWithDelegate:self]; 

mais XCode afficher une erreur: auto est conforme <Foo> protocole, alors que l'auto ne ont pas besoin pour se conformer à ce protocole.

Comment éviter ce conflit de noms?

Répondre

5

Modifiez le nom de la méthode.

- (id)initWithFooDelegate(id<Foo>)delegate; 
+0

En fait, j'ai essayé cette solution, mais je demande toujours s'il y a d'autres solutions à ce problème ennuyeux – KONG

4

Je ne suis pas sûr à 100% si je comprends ce que vous faites, mais je pense que le problème est que vous essayez d'utiliser des méthodes covariantes dans l'objectif C (méthodes avec le même nom de sélecteur, mais différemment saisi arguments). Techniquement parlant, le code que vous avez écrit fonctionnera correctement à l'exécution, mais comme le compilateur n'a pas assez d'informations sur le type pour savoir à quelle classe de l'objectif il envoie le message, il ne peut pas savoir lequel des deux initWithDelegate: est le bon pour l'objet, donc il devine (eh bien, je pense qu'il utilise toujours le premier déclaré, mais le fait est qu'il prend une décision arbitraire). Cela signifie que les appels à l'un ou à l'autre donneront toujours des avertissements. La solution suggérée par Apple est de ne pas utiliser des méthodes du même nom qui prennent des types différents.

Vous pouvez vérifier la question this pour plus de détails.

Questions connexes