87 votes

Substitution de 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 annulée

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

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

148voto

Benoît Points 5598

À partir de la documentation d'Apple:

Bien que l'Objective-C langue vous permet d'utiliser une catégorie de remplacer les méthodes de la classe hérite, ou même les méthodes déclarées dans l'interface de classe, il vous est fortement déconseillé de le faire. Une catégorie n'est pas un substitut pour une sous-classe. Il y a plusieurs lacunes importantes à l'aide d'une catégorie de remplacer les méthodes:

  • Lorsqu'une catégorie remplace hérité d'un de la méthode, de la méthode dans la catégorie pouvez, comme d'habitude, invoquer l'héritage mise en œuvre par l'intermédiaire d'un message à l' super. Toutefois, si une catégorie remplace un méthode qui existe dans la catégorie de la classe, il est inutile d'invoquer la mise en œuvre d'origine.

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

    Cette question est d'une importance particulière, car de nombreux de la de Cacao classes sont mises en œuvre à l'aide de catégories. Un cadre défini par la méthode que vous essayez de remplacer peut lui-même ont été mis en œuvre dans une catégorie, et donc de mise en œuvre qui prend la priorité n'est pas défini.

  • La présence de certaines catégorie de méthodes peut provoquer des changements de comportement dans tous les cadres. Par exemple, si vous remplacez l' windowWillClose: délégué de la méthode dans une catégorie sur NSObject, toutes les fenêtres de délégués dans votre programme, puis répondre à l'aide de la catégorie de la méthode; le comportement de toutes les instances de NSWindow peut changer. Catégories de vous ajouter sur un cadre de classe peuvent causer des mystérieux changements de comportement et de conduire à des accidents.

18voto

Martin Babacaev Points 2492

Vous pouvez le faire par l'adaptation de la Classe Cluster approche, ou à l'aide de méthodes swizzling technique.

Sinon, le comportement de deux ou plus classés méthodes est pas défini

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X