"unrecognized selector gesendet class" beim Aufruf der Kategorie-Methode aus einer Bibliothek
Problem
Diese Frage mag ein bisschen lang, aber ich versuche zu geben, so viel Informationen wie möglich, da bin ich wirklich gestaffelt von diesem.
Ich arbeite zurzeit ein einem Bibliothek die sollten automatisieren XML-Dokument Parsen. Aber habe ich jetzt ein problem, testen Sie die Bibliothek, für die erste Zeit.
Habe ich ein Bibliothek-Klasse genannt CSXDocumentLayout
stellt das layout eines Dokuments. Diese Klasse enthält die private Methode - (NSError *)readLayoutDocument:(NSString *)fpath
Aufruf aus einem init-Methode.
/* MARK: Reading in Layouts */
- (NSError *)readLayoutDocument:(NSString *)fpath {
CSXDocumentLayout *layout;
CSXXMLParser *parser;
BOOL state;
layout = [CSXDocumentLayout layoutDocumentLayout];
parser = [[CSXXMLParser alloc] initWithDocumentLayouts:
[NSArray arrayWithObject:layout]];
parser.file = fpath;
state = [parser parse];
if(state == NO || parser.error != nil) {
return parser.error;
}
return nil;
}
Diese Methode liest ein XML-Dokument, welches das layout eines anderen XML-Dokuments. Es wird analysiert, indem die Klasse CSXXMLParser
, die ich testen möchte.
Erstelle ich ein Objekt, das einem layout-Dokument mit +[CSXDocumentLayout layoutDocumentLayout]
. Diese Methode ist implementiert in der Kategorie CSXDocumentLayout (CSXLayoutObject)
.
Unten ist meine test-Datei:
#import <Foundation/Foundation.h>
#import <CeasyXML.h>
int main(int argc, const char **argv) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *file;
file = [NSString stringWithUTF8String:__FILE__];
file = [file stringByDeletingLastPathComponent];
file = [file stringByAppendingPathComponent:@"Layout.xml"];
CSXDocumentLayout *layout;
NSError *error;
layout = [[CSXDocumentLayout alloc] initWithLayoutDocument:file
error:&error];
if(layout == nil) {
NSLog(@"Could not create layout: %@", error);
exit(0);
}
NSLog(@"Layout:\n%@", layout);
[pool release];
return 0;
}
Diese Datei kompiliert, um eine separate ausführbare Zusammenhang mit meiner statische Bibliothek libceasyxml.ein. Alles kompiliert Prima ohne irgendwelche Warnungen.
Aber wenn ich es bekomme ich ein unrecognized selector geschickt-Klasse Ausnahme:
2012-05-02 16:59:47.620 TestApp[1887:a0f] +[CSXDocumentLayout layoutDocumentLayout]: unrecognized selector sent to class 0x1000064c8
2012-05-02 16:59:47.791 TestApp[1887:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[CSXDocumentLayout layoutDocumentLayout]: unrecognized selector sent to class 0x1000064c8'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff83e47784 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff84604f03 objc_exception_throw + 45
2 CoreFoundation 0x00007fff83ea11a0 __CFFullMethodName + 0
3 CoreFoundation 0x00007fff83e198ef ___forwarding___ + 751
4 CoreFoundation 0x00007fff83e15a38 _CF_forwarding_prep_0 + 232
5 TestApp 0x0000000100001512 -[CSXDocumentLayout(Private) readLayoutDocument:] + 49
6 TestApp 0x00000001000010d4 -[CSXDocumentLayout initWithLayoutDocument:error:] + 96
7 TestApp 0x0000000100001017 main + 179
8 TestApp 0x0000000100000f5c start + 52
9 ??? 0x0000000000000001 0x0 + 1
)
Ich finde es sehr beunruhigend, ich kann nicht call der Methode der Klasse +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout]
kann ich zwar aufrufen beide -[CSXDocumentLayout initWithLayoutDocument:error:]
, und -[CSXDocumentLayout(Private) readLayoutDocument:]
.
Forschung
Ich habe überprüft, ob die Methode ist definiert in der Ausgabe-Dateien durch ausführen von nm file
und es ist, naja teilweise:
In libceasyxml.ein es wird definiert (nm libceasyxml.a)
...
libceasyxml.a(CSXDocumentLayout+CSXLayoutObject.o):
0000000000000100 t +[CSXDocumentLayout(CSXLayoutObject) classAttributeLayout]
00000000000020e0 s +[CSXDocumentLayout(CSXLayoutObject) classAttributeLayout].eh
000000000000056b t +[CSXDocumentLayout(CSXLayoutObject) documentElementLayout]
0000000000002180 s +[CSXDocumentLayout(CSXLayoutObject) documentElementLayout].eh
0000000000000402 t +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout]
0000000000002148 s +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout].eh
0000000000000200 t +[CSXDocumentLayout(CSXLayoutObject) layoutElementLayout]
0000000000002110 s +[CSXDocumentLayout(CSXLayoutObject) layoutElementLayout].eh
0000000000000000 t +[CSXDocumentLayout(CSXLayoutObject) nameAttributeLayout]
00000000000020b0 s +[CSXDocumentLayout(CSXLayoutObject) nameAttributeLayout].eh
0000000000002098 s EH_frame1
0000000000001c49 s LC0
...
In TestApp, es ist NICHT definiert (nm TestApp), ich finde keine Methode mit dem Namen der Kategorie CSXLayoutObject
.
...
0000000100001271 t -[CSXDocumentLayout setDocumentClassString:]
00000001000013a8 t -[CSXDocumentLayout setElements:]
0000000100001490 t -[CSXDocumentLayout setName:]
00000001000014db t -[CSXDocumentLayout(Private) readLayoutDocument:]
0000000100004060 t -[CSXElementList dealloc]
00000001000040b0 t -[CSXElementList elements]
...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, Sie haben ein bekanntes problem Kategorien eingebettet in statischen Bibliotheken.
Wenn ich richtig bin, versuchen, kompilieren Sie mit den linker-flags
-ObjC
(und wenn das nicht reicht, auch-all_load
) und sollte dein problem verschwinden.Obwohl Sie die Antwort bereits ausgewählt ist, möchte ich die Lösung für mein Problem war hier, wie einfach es auch sein mag. Vergewissern Sie sich, dass Ihre Klasse richtig überprüft in der
Target Membership
Feld unter derFile Inspector
Bereich. Wenn Sie dies nicht tun, dann ist es nur natürlich erhaltenunrecognized selector sent to class
Fehler.