Question

J'étends une classe à partir d'une bibliothèque externe. Voici mon code:

fichier d'en-tête: Manager + MyCategory.h

#import "Manager.h"
#import "Element.h"

@interface Manager (myCategory) 
- (Element*) elementWithTag:(NSInteger)tag; 
@end

fichier de mise en œuvre: Manager + fichier MyCategory.h

@implementation Manager (myCategory) 

- (Element*) elementWithTag:(NSInteger)tag {
    ...
}

@end

Maintenant, voici comment j'utilise cette catégorie:

#import "Manager+MyCategory.h"

@implementation myClass 

- (void) myFunction:(NSInteger)tag {
   Manager* myManager = [[Manager alloc] init];
   Element* = [myManager elementWithTag:tag];

   ...

   [myManager release];
}

@end

Quand je compile Je n'ai pas, mais les avertissements quand je lance mon programme, je reçois l'erreur suivante:

*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:

fichier d'en-tête (c.-à-Manager + MyCategory.h) est importé correctement mais il semble que le lien avec le fichier de mise en œuvre ne se fait pas. Si je remplace #import "Manager + MyCategory **. ** h" par #import "Manager + MyCategory **. ** m" dans ma classe qu'il fonctionne correctement.

Tout le monde peut me expliquer ce que j'oublié? Merci

Était-ce utile?

La solution

Les catégories ne fonctionnent pas bien avec Unix traditionnels statiques Bibliothèques.

Si tel est votre cas, il semble que passer l'option -ObjC à l'éditeur de liens résout le problème.

& Apple technique Q Un QA1490 explique tout.

Autres conseils

Je soupçonne que vous avez oublié d'ajouter le gestionnaire + MyCategory.m à la cible approrpriate dans Xcode. Vous ne recevez pas une erreur de liens parce que tous les symboles existent et il n'y a pas d'avertissement du compilateur parce que vous avez inclus les fichiers d'en-tête appropriés, mais lors de l'exécution de la mise en œuvre de la méthode elementWithTag: est manquante.

Toutes mes excuses, n'a pas pu ajouter ceci comme commentaire ...

Juste pour le test, vous pouvez ajouter une fonction extern c déclarée dans l'en-tête et mis en œuvre dans le fichier .m. Si vous appelez cette fonction c dans votre code de test alors ce générer une erreur de liaison en raison d'un identifiant non résolu.

Cela peut rendre plus facile d'enquêter sur le problème car il fournit une rétroaction immédiate et peut générer quelques indices supplémentaires pour expliquer pourquoi le fichier n'est pas inclus.

Compte tenu du laps de temps, je suppose que vous avez fait cela, mais juste au cas où ... assurez-vous que vous avez nettoyé la cible, arrêtez XCode, puis rouvrez. J'ai eu les fichiers de projet sont endommagés dans la mémoire et agir étrangement.

Barney

J'ai eu ce problème lors de la mise à niveau Xcode 4.

Pour corriger je devais séparer ma définition de la catégorie dans une .m séparée et une .h - Xcode 3 semblait d'accord avec la mise en œuvre et de l'interface étant dans un .h ... mais oh non Xcode pointilleux 4 est plutôt anal <. / p>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top