Objective-C Category Causant un sélecteur non reconnu

Mon projet a une fonction de catégorie UIImage que je veux appeler d’une autre classe. J’importe correctement le fichier d’en-tête pour la catégorie d’image et je comstack le projet sans avertissement.

Le problème est que lorsque j’appelle la fonction de catégorie UIImage , j’ai vu une erreur de sélecteur non reconnue avec une NSInvalidArgumentException . Pourquoi est-ce que je vois cela si j’ai bien lié tout?

 #import  @interface UIImage (DRShare) + (UIImage*) imageNamed:(NSSsortingng*)name; @end @implementation UIImage (DRShare) + (UIImage*) imageNamedDR:(NSSsortingng*)name{ CGFloat s = 1.0f; if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){ s = [[UIScreen mainScreen] scale]; } NSSsortingng *path = [NSSsortingng ssortingngWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""]; return [UIImage imageWithContentsOfFile:DRBUNDLE(path)]; } @end 

fichier qui l’appelle:

  backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]]; 

exception soulevée:

 2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938 2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938' *** Call stack at first throw: ( 0 CoreFoundation 0x02e65b99 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x02fb540e objc_exception_throw + 47 2 CoreFoundation 0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x02dd72b6 ___forwarding___ + 966 4 CoreFoundation 0x02dd6e72 _CF_forwarding_prep_0 + 50 5 TapTapShare 0x0001291c -[DRShareViewController backgroundView] + 127 6 TapTapShare 0x00012343 -[DRShareViewController loadView] + 639 7 UIKit 0x0044f54f -[UIViewController view] + 56 8 UIKit 0x0044d9f4 -[UIViewController contentScrollView] + 42 9 UIKit 0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48 10 UIKit 0x0045bea3 -[UINavigationController _layoutViewController:] + 43 11 UIKit 0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524 12 UIKit 0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266 13 UIKit 0x00574b55 -[UILayoutContainerView layoutSubviews] + 226 14 QuartzCore 0x02616481 -[CALayer layoutSublayers] + 177 15 QuartzCore 0x026161b1 CALayerLayoutIfNeeded + 220 16 QuartzCore 0x026160bd -[CALayer layoutIfNeeded] + 111 

Quelques possibilités:

  1. Vous n’avez pas lié UIImage+TTShare.m à votre cible. Donc, alors que vous avez l’en-tête, vous ne comstackz pas l’implémentation.
  2. Si cela fait partie d’une bibliothèque statique, vous devez append -all_load au -all_load de -all_load Other Linker Flags pour la liaison d’application avec la bibliothèque.

Si vous souhaitez utiliser la méthode Category, vous devez append -ObjC au paramètre de création Other Linker Flags de votre application.

J’ai eu le même problème et j’ai dû appliquer ce correctif aussi. Mon fichier source NSDate-Extensions.m ne compilait pas, je devais donc aller dans les parameters du projet, puis sélectionner la cible appropriée, puis cliquer sur l’onglet “Build Phases”, puis développer les éléments “Comstack Sources”, puis cliquer sur le symbole + et ajoutez manuellement mon fichier NSDate-Extensions.m.

J’ai eu ce message d’erreur et j’utilise des Cocoapods. Pour corriger l’erreur, il suffisait d’appeler à nouveau l’ pod install pour créer correctement toutes les liaisons nécessaires.

Une autre possibilité.

Vous avez l’implémentation de la catégorie mais n’avez pas d’interface. Je veux dire que vous avez oublié de déclarer dans * .h l’interface de votre catégorie.

Encore une autre possibilité:

C’est presque trop gênant d’admettre, mais juste au cas où quelqu’un aurait fait la même erreur idiote:

Je copiais le code d’un projet à un autre et, par erreur, j’avais collé le même code source dans le fichier .h et le fichier .m (dans les deux cas, j’avais mis le code destiné au fichier .h ). J’ai corrigé mon fichier .m et ça a fonctionné.

Peut-être parce que vous écrivez imageNamed au lieu de imageNamedDR dans l’interface.