«неопознанный селектор отправлен в класс» при вызове метода категории из библиотеки

Проблема

Этот вопрос может показаться немного длинным, но я стараюсь дать как можно больше информации, так как я действительно поражен этим.

В настоящее время я работаю над библиотекой , которая должна автоматизировать синтаксический анализ XML-документов. Но я столкнулся с проблемой, когда впервые тестирую библиотеку.

У меня есть библиотечный класс с именем CSXDocumentLayout, который представляет макет документа. Этот класс содержит закрытый метод - (NSError *)readLayoutDocument:(NSString *)fpath, вызываемый из метода инициализации.

/* 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;
}

Этот метод считывает XML-документ, представляющий макет другого XML-документа. Он анализируется классом CSXXMLParser, который я хочу протестировать.

Я создаю объект, представляющий макет документа, с помощью +[CSXDocumentLayout layoutDocumentLayout]. Этот метод реализован в категории CSXDocumentLayout (CSXLayoutObject).

Ниже приведен мой тестовый файл:

#import 
#import 

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;
}

Этот файл компилируется в отдельный исполняемый файл, связанный с моей статической библиотекой libceasyxml.a . Все компилируется нормально, без всяких предупреждений.

Но когда я запускаю его, я получаю нераспознанный селектор, отправленный в класс исключение:

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
)

Меня очень беспокоит, что я не могу вызвать метод класса +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout], хотя я могу вызвать оба -[CSXDocumentLayout initWithLayoutDocument:error:], и -[CSXDocumentLayout(Private) readLayoutDocument:].

Исследования

Я проверил, определен ли метод в выходных файлах, запустив nm fileи он определен частично:

В libceasyxml.a, он определен(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
...

В TestApp он НЕ определен(nm TestApp), на самом деле я не могу найти ни одного метода с именем категории 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]
...
10
задан v1Axvw 17 July 2014 в 15:12
поделиться