"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]
...
InformationsquelleAutor v1Axvw | 2012-05-02
Schreibe einen Kommentar