Remplacer les méthodes utilisant des catégories dans Objective-C

Puis-je utiliser une catégorie de classe pour remplacer une méthode déjà implémentée à l’aide d’une catégorie? Comme ça:

1) méthode originale

-(BOOL) method { return true; } 

2) Méthode outrepassée

 -(BOOL) method { NSLog(@"error?"); return true; } 

Cela fonctionnera-t-il ou est-ce illégal?

De la documentation Apple :

Bien que le langage Objective-C vous permette actuellement d’utiliser une catégorie pour remplacer les méthodes héritées par la classe, ou même les méthodes déclarées dans l’interface de classe, vous en êtes fortement déconseillé . Une catégorie ne remplace pas une sous-classe. L’utilisation d’une catégorie pour remplacer des méthodes comporte plusieurs lacunes importantes:

  • Lorsqu’une catégorie remplace une méthode héritée, la méthode de la catégorie peut, comme d’habitude, appeler l’implémentation héritée via un message à super . Toutefois, si une catégorie remplace une méthode existant dans la classe de la catégorie, il est impossible d’appeler l’implémentation d’origine .

  • Une catégorie ne peut pas remplacer de manière fiable les méthodes déclarées dans une autre catégorie de la même classe.

    Ce problème est particulièrement important car de nombreuses classes Cocoa sont implémentées en utilisant des catégories. Une méthode définie par le framework que vous tentez de remplacer peut elle-même avoir été implémentée dans une catégorie, de sorte que la mise en œuvre prioritaire n’est pas définie.

  • La présence même de certaines méthodes de catégorie peut entraîner des changements de comportement dans tous les frameworks. Par exemple, si vous remplacez la méthode windowWillClose: delegate dans une catégorie sur NSObject, tous les delegates de fenêtre de votre programme répondent alors à l’aide de la méthode category; Le comportement de toutes vos instances de NSWindow peut changer. Les catégories que vous ajoutez dans une classe de structure peuvent provoquer des modifications mystérieuses du comportement et entraîner des pannes.

Vous pouvez le faire en adaptant l’approche Class Cluster ou en utilisant des techniques de swizzling .

Sinon, le comportement de plusieurs méthodes catégorisées est indéfini

L’ancien lien de documentation est mort; Le meilleur remplacement que j’ai pu trouver était ici: Apple Docs :

Catégorie à éviter Nom de la méthode Clashes

Les méthodes déclarées dans une catégorie étant ajoutées à une classe existante, vous devez faire très attention aux noms de méthode.

Si le nom d’une méthode déclarée dans une catégorie est identique à une méthode de la classe d’origine ou d’une méthode d’une autre catégorie de la même classe (ou même d’une super-classe), le comportement n’est pas défini. runtime Cela risque moins d’être un problème si vous utilisez des catégories avec vos propres classes, mais cela peut poser des problèmes lors de l’utilisation de catégories pour append des méthodes aux classes Cocoa ou Cocoa Touch standard.

Apple utilise une touche plus légère, mais le point principal est le même: vous invitez le désastre, car le comportement imprévisible est silencieux.

Il est important de noter qu’une catégorie peut également être utilisée pour remplacer les méthodes existantes dans la classe de base (par exemple, la méthode de lecteur de la classe Car), mais vous ne devriez jamais le faire. Le problème est que les catégories constituent une structure organisationnelle plate. Si vous remplacez une méthode existante dans Car + Maintenance.m et que vous décidez ensuite de modifier à nouveau son comportement avec une autre catégorie, Objective-C ne peut pas savoir quelle implémentation utiliser. Le sous-classement est presque toujours une meilleure option dans une telle situation.

À partir de ce tutoriel, http://rypress.com/tutorials/objective-c/categories