2009-07-08 5 views
2

Ich erweitere eine Klasse aus einer externen Bibliothek. Hier ist mein Code:Objective-C Kategorie seltsames Verhalten importieren

Header-Datei: Manager, + MyCategory.h

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

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

Implementierungsdatei: Manager, + MyCategory.h Datei

@implementation Manager (myCategory) 

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

@end 

Hier ist, wie ich diese Kategorie verwenden:

Wenn ich kompiliere, habe ich keine Warnungen, aber wenn ich mein Programm starte, erhalte ich den folgenden Fehler:

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

Header-Datei (dh Manager + MyCategory.h) wird korrekt importiert, aber es sieht so aus, als ob die Verknüpfung mit der Implementierungsdatei nicht erfolgt. Wenn ich ersetzen #import "Manager + MyCategory **. H **" von #import "Manager + Meine Kategorie **. M **" in meiner Klasse funktioniert es richtig.

Jeder kann mir erklären, was ich vergessen habe? Danke

Antwort

1

Kategorien funktionieren nicht gut mit traditionellen Unix statischen Bibliotheken.

Wenn das Ihr Fall ist, scheint es, dass an den Linker die -ObjC Option vorbei das Problem behebt.

Apple Technical Q&A QA1490 erklärt alles.

+0

Danke! Fügen Sie einfach -ObjC Linker Flag zu meinem Projekt hinzu und es funktioniert einwandfrei – Thomas

4

Ich vermute, dass Sie vergessen haben, den Manager + MyCategory.m zu dem passenden Ziel in Xcode hinzuzufügen. Sie haben nicht ein Linker-Fehler erhalten, weil alle Symbole existieren und es gibt keine Compiler-Warnung, weil Sie die entsprechenden Header-Dateien enthalten, aber zur Laufzeit die Umsetzung des elementWithTag: Verfahren fehlt.

+0

Guter Punkt! aber ich überprüfte und Manager-+ MyCategory.m ist auch in dem Ziel kompiliert Quellen. Thx auf jeden Fall – Thomas

+1

Eine weitere Überprüfung der Gesundheit nie geschadet.Versuchen Sie einen # Fehler in Ihrem Manager + MyCategory.m zu werfen. Wenn der Compiler nicht fehlschlägt, wissen Sie sicher, dass Ihre Kategorie nicht kompiliert wird. – kperryua

+0

Sorry, ich konnte nicht helfen. Ich werde die Antwort hier lassen, weil es jemand anderen in der Zukunft helfen kann. Viel Glück. –

0

Apologies, konnte nicht fügen Sie diese als Kommentar ...

Nur für die Prüfung, erhalten Sie eine extern c Funktion im Header deklariert hinzufügen möchten, und in der .m-Datei implementiert. Wenn Sie diese c-Funktion in Ihrem Testcode aufrufen, generiert dieser einen Linker-Fehler aufgrund eines unaufgelösten Bezeichners.

das Problem Dies kann es leichter zu untersuchen, wie es ein unmittelbares Feedback liefert und möglicherweise einige zusätzliche Hinweise darauf, warum die Datei, die enthalten ist, nicht erzeugen.

der Zeitrahmen gegeben, ich nehme an, Sie haben dies getan, aber nur für den Fall ... stellen Sie sicher, dass Sie das Ziel gereinigt haben, heruntergefahren XCode, und dann wieder zu öffnen. Ich habe die Projektdateien im Speicher beschädigt und merkwürdig verhalten.

Barney

+0

Ooooh !! Etwas Interessantes ist passiert (obwohl ich nicht denke, dass die Arbeit "interessant" ist :)). Ich habe eine externe c-Funktion in meinem Kategorie-Header hinzugefügt und in der .m-Datei implementiert. Ich habe es innerhalb meines Testcodes aufgerufen und, rate mal, alles funktioniert einwandfrei: externe Funktion wird aufgerufen, genauso wie die "elementWithTag" -Methode. Ich verstehe nichts und werde verrückt. Natürlich reinigte ich das Ziel, in der Nähe und wieder öffnen XCode. Danke Thomas – Thomas

+0

Ich habe vergessen zu erwähnen, dass, wenn ich die externe C-Funktion entfernen, es nicht mehr funktioniert. – Thomas

+0

Das ist ziemlich interessant. Haben Sie versucht, die Linker-Einstellungen anzupassen, z. B. die Deaktivierung von "Dead Code Stripping". Ich vermute, das ist ein Fehler in der Linker-Optimierung. Es wäre eine gute Idee, einen Fehlerbericht mit Apple zu öffnen. –

0

hatte ich dieses Problem beim zu Xcode 4.

Upgrade ich meine Kategorie Definition in eine separate .m und .h zu trennen Um dies zu beheben hatte - Xcode 3 schien in Ordnung mit der Implementierung und Schnittstelle in einem zu sein. h ... aber oh kein wählerischer Xcode 4 ist eher anal.