35 votes

La méthode d'appel sur la catégorie incluse dans la bibliothèque statique de l'iPhone entraîne une exception NSInvalidArgumentException

J'ai créé une bibliothèque statique pour héberger une partie de mon code comme les catégories.

J'ai une catégorie pour UIViews dans "UIView-Extensions.h" nommé Extensions.

Dans cette catégorie, j'ai une méthode appelée:

- (void)fadeOutWithDelay:(CGFloat)delay duration:(CGFloat)duration;

L'appel à cette méthode fonctionne très bien sur le simulateur configuration de Débogage.

Toutefois, si vous essayez d'exécuter l'application sur le périphérique-je obtenir un NSInvalidArgumentException:

[UIView fadeOutWithDelay:duration:]: unrecognized selector sent to instance 0x1912b0
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIView fadeOutWithDelay:duration:]: unrecognized selector sent to instance 0x1912b0

Il semble, pour quelque raison UIView-Extensions.h n'est pas inclus dans le dispositif s'appuie.


Ce que j'ai vérifié/essayé

Je l'ai fait essayer à une autre catégorie pour NSString, et a eu le même problème.

D'autres fichiers, comme ensemble de classes et de fonctions de fonctionner correctement. C'est une question que les seuls qui se passe avec les catégories.

J'ai fait un nettoyage de toutes les cibles, ce qui n'a pas de résoudre le problème.

J'ai vérifié le projet de bibliothèque statique, les catégories sont inclus dans la cible de la "copie des en-têtes" et "compiler" sources de groupes.

La bibliothèque statique est inclus dans les principaux projets de "lien binaire avec la bibliothèque" du groupe.

Un autre projet, j'ai ajouté la bibliothèque statique pour fonctionne très bien.

J'ai supprimé et re-ajout de la bibliothèque statique avec pas de chance

-ObjC de l'éditeur de liens drapeau est réglé

Des idées?


nm sortie

libFJSCodeDebug.a(UIView-Extensions.o):
000004d4 t -[UIView(Extensions) changeColor:withDelay:duration:]
00000000 t -[UIView(Extensions) fadeInWithDelay:duration:]
000000dc t -[UIView(Extensions) fadeOutWithDelay:duration:]
00000abc t -[UIView(Extensions) firstResponder]
000006b0 t -[UIView(Extensions) hasSubviewOfClass:]
00000870 t -[UIView(Extensions) hasSubviewOfClass:thatContainsPoint:]
000005cc t -[UIView(Extensions) rotate:]
000002d8 t -[UIView(Extensions) shrinkToSize:withDelay:duration:]
000001b8 t -[UIView(Extensions) translateToFrame:delay:duration:]
         U _CGAffineTransformRotate
000004a8 t _CGPointMake
         U _CGRectContainsPoint
         U _NSLog
         U _OBJC_CLASS_$_UIColor
         U _OBJC_CLASS_$_UIView
         U ___CFConstantStringClassReference
         U ___addsf3vfp
         U ___divdf3vfp
         U ___divsf3vfp
         U ___extendsfdf2vfp
         U ___muldf3vfp
         U ___truncdfsf2vfp
         U _objc_enumerationMutation
         U _objc_msgSend
         U _objc_msgSend_stret
         U dyld_stub_binding_helper

30voto

Corey Floyd Points 16747

La seule solution qui a fonctionné a été d'inclure:

"-all_load"

dans d'autres drapeaux de l'éditeur de liens.

EDIT: Veillez à ajouter cet indicateur au projet, y compris la bibliothèque statique, et non à la bibliothèque statique elle-même.

Je sais que ce n'est pas la bonne méthode, mais cela fonctionne pour le moment.

C’est peut-être un problème lié au système d’exploitation 3.0, car c’était également le cas pour Three20.

14voto

Jason Coco Points 52303

Malheureusement, en raison de l'quelles sont les catégories de travail et la nature dynamique de l'Objective-C runtime, tout ne fonctionne pas bien avec les bibliothèques statiques. La raison pour laquelle vous obtenez cette erreur, c'est que la catégorie de la mise en œuvre dans la bibliothèque statique est jamais réellement lié à l'exécutable de l'image parce que le compilateur n'a aucun moyen de savoir que la mise en œuvre du code sera nécessaire au moment de l'exécution.

Afin de remédier à cela, vous pouvez forcer l'éditeur de liens pour copier des fichiers de l'objet à partir d'une bibliothèque statique pour tout Objective-C Classe et de la Catégorie d'images. L'inconvénient est que votre exécutable comprendra image de code pour les classes que vous ne pouvez pas les utiliser du tout. Pour obtenir de l'éditeur de liens pour inclure le code de la catégorie, ajoutez - -ObjC de la OTHER_LD_FLAGS paramètre de construction dans Xcode. Votre catégorie de la mise en œuvre va maintenant être copié à partir de la bibliothèque statique pour votre exécutable et vous n'obtiendrez pas l'exception d'exécution.

6voto

ev0 Points 136

Je viens de parler à un ingénieur Apple à ce sujet, et cela a été traité dans les versions ultérieures avec une version> 100. Ceci est inclus dans XCode4. Il m'a guidé à travers cela et j'ai essayé moi-même et en effet le problème de catégorie est résolu.

Retirez "-all_load" et revenez à "-ObjC" dans vos paramètres de construction avec le nouvel éditeur de liens.

5voto

Erik Doernenburg Points 1100

Si vous êtes sur Xcode 3.2, vous pouvez éviter d'utiliser -all_load mais plutôt -force_load pour la bibliothèque en question, ce qui devrait être légèrement plus efficace.

Ceci est décrit dans un document d’assistance technique Apple récemment mis à jour: http://developer.apple.com/mac/library/qa/qa2006/qa1490.html

3voto

tonklon Points 5687

Le problème nécessitant des indicateurs de lieur -all_load ou -force_load pour lier des catégories a été résolu dans LLVM . Le correctif est inclus dans LLVM 2.9 La première version de Xcode à contenir le correctif est Xcode 4.2 fourni avec LLVM 3.0. Les correctifs mentionnés ne sont plus nécessaires lorsque vous utilisez Xcode 4.2. L'indicateur -ObjC est toujours nécessaire lors de la liaison de fichiers binaires ObjC

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