Question

Si une catégorie que je crée pour une classe ajoute des méthodes qui remplissent également le contrat établi par un protocole, je voudrais signaler que la classe de catégorie que la mise en œuvre du protocole, et indiquer ainsi à l'Obj-C avant processeur que la classe implémente le protocole efficacement aussi bien.

délégué Exemple (pour plus de clarté, merci Ole!):

@protocol SomeDelegate <NSObject>
  - (void)someDelegateMessage;
@end

Exemple catégorie:

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

Et avec une mise en œuvre autrement typique

@implement NSObject (SomeCategory)
  - (void)someDelegateMessage {}
@end

Quand j'essaie en fait, je reçois un avertissement pour chaque méthode NSObject:

  

avertissement: mise en œuvre incomplète de la catégorie 'SomeCategory'

     

avertissement: définition de la méthode pour '-description' not found

     

...

     

avertissement: définition de la méthode pour '-isEqual:' not found

     

avertissement: catégorie 'SomeCategory' ne met pas en œuvre pleinement le protocole 'NSObject'

fonctionne très bien si je retire <SomeDelegate> de la déclaration, mais bien sûr NSObject n'est pas reconnu comme SomeDelegate

Était-ce utile?

La solution

Une solution consiste à déclarer le protocole sur une catégorie sans mise en oeuvre, et mettre en oeuvre le procédé dans une catégorie différente, par exemple:.

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end

Si vous faites cela, NSObject sera considérée comme conforme à <SomeDelegate> au moment de la compilation, et des contrôles d'exécution pour someDelegateMessage réussira. Cependant, les contrôles d'exécution conformsToProtocol: échouera.

Bien sûr, vous devez un bug demandant que les méthodes déclarées sur la classe de base ne génèrent pas avertissements.

Autres conseils

Une chance votre déclaration de protocole inclut le protocole NSObject? Comme ceci:

@protocol SomeDelegate <NSObject>
...

C'est là que les avertissements viennent parce que maintenant votre catégorie ne met pas en œuvre le protocole complet. Dans le code de test que je viens tapé, la suppression NSObject du protocole supprime les avertissements du compilateur.

Si vous voulez que le compilateur de se taire sur l'envoi messages (et il est important que vous vous rappelez que thats le nom du protocole, et non le nom de la classe), puis il suffit d'utiliser des variables « id », pas « id » depuis des thats vous dire explicitement le compilateur « Ceci est un objet qui implémente uniquement le protocole SomeDelegate ».

Vous pouvez également utiliser NSObject comme type variable au lieu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top