97 votes

Supprimer message d’avertissement « Catégorie met en œuvre une méthode qui s’appliquera également par sa classe primaire »

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 :

341voto

einsteinx2 Points 6624

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

63voto

bneely Points 4860

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.

20voto

Sanjit Saluja Points 3221

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:));

10voto

Essayez ceci dans votre code :

MAJ2 : Ajouter cette macro

5voto

neodev003 Points 166

Vous pouvez utiliser swizzling méthode pour supprimer cet avertissement de compilateur. Voici comment j’ai implémenté swizzling méthode pour dessiner des marges dans un UITextField lorsque nous utilisons un arrière-plan personnalisé avec UITextBorderStyleNone :

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