Je me demandais comment faire pour supprimer l’avertissement « Catégorie met en œuvre une méthode qui s’appliquera également par sa classe primaire ».
J’ai ceci pour une catégorie de code spécifique :
Je me demandais comment faire pour supprimer l’avertissement « Catégorie met en œuvre une méthode qui s’appliquera également par sa classe primaire ».
J’ai ceci pour une catégorie de code spécifique :
Bien que tout bneely dit est correct, il n'a pas vraiment répondre à votre question de comment faire pour supprimer l'avertissement.
Si vous disposez de ce code dans pour une raison quelconque (dans mon cas, j'ai HockeyKit dans mon projet et ils le remplacement d'une méthode dans une UIImage catégorie [edit: ce n'est plus le cas]) et que vous avez besoin pour obtenir votre projet pour compiler, vous pouvez utiliser #pragma
des déclarations de bloquer l'avertissement comme suit:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
// do your override
#pragma clang diagnostic pop
J'ai trouvé les informations ici: http://www.cocoabuilder.com/archive/xcode/313767-disable-warning-for-override-in-category.html
Une catégorie permet d'ajouter de nouvelles méthodes à une classe existante. Si vous souhaitez ré-écrire une méthode qui existe déjà dans la classe, en général, vous créez une sous-classe au lieu d'une catégorie.
La documentation d'Apple: la Personnalisation des classes existantes
Si le nom d'une méthode déclarée dans un la catégorie est le même comme une méthode dans la classe d'origine, ou une méthode dans une autre catégorie dans la même classe (ou même une super-classe), la le comportement est indéfini quant à la méthode de la mise en œuvre est utilisée à moment de l'exécution.
Deux méthodes avec exactement la même signature dans la même catégorie d'entraîner un comportement imprévisible, parce que l'appelant ne peut pas spécifier de mise en œuvre qui ils veulent.
Donc, vous devez soit utiliser une catégorie et de fournir les noms de méthode qui sont uniques et nouvelles pour la classe ou sous-classe si vous souhaitez modifier le comportement d'une méthode dans une classe.
Une meilleure alternative (voir bneely la réponse à pourquoi cet avertissement est de vous sauver de la catastrophe") est l'utilisation de la méthode swizzling. En utilisant la méthode swizzling, vous pouvez remplacer une méthode à partir d'une catégorie, sans l'incertitude de qui "gagne", et tout en préservant la possibilité d'appel par l'intermédiaire de l'ancienne méthode. Le secret est de donner la remplacer un autre nom de la méthode, puis l'échange de l'exécution des fonctions.
#import <objc/runtime.h>
#import <objc/message.h>
void MethodSwizzle(Class c, SEL orig, SEL new) {
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
Définissez ensuite votre personnalisé de mise en œuvre:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Remplacer la valeur par défaut de mise en œuvre avec les vôtres:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
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.