gpt4 book ai didi

objective-c - 从库中调用类别方法时出现 "unrecognized selector sent to class"

转载 作者:太空狗 更新时间:2023-10-30 03:27:18 25 4
gpt4 key购买 nike

问题

这个问题可能看起来有点长,但我尽量提供尽可能多的信息,因为我真的很困惑。

我目前在 library 工作它应该自动解析 XML 文档。但是我现在第一次测试这个库时遇到了问题。

我有一个名为 CSXDocumentLayout 的库类,它表示文档的布局。此类包含从 init 方法调用的私有(private)方法 - (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 <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;
}

此文件编译为链接到我的静态库 libceasyxml.a 的单独可执行文件。一切都编译得很好,没有任何警告。

但是当我运行它时,我得到了一个unrecognized selector sent to class异常:

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]
...

最佳答案

编辑:修复了断开的链接

我怀疑您遇到了一个已知问题 categories embedded in static libraries .

如果我是对的,请尝试使用链接器标志 -ObjC 进行编译(如果这还不够,还可以使用 -all_load),您的问题应该会消失。

关于objective-c - 从库中调用类别方法时出现 "unrecognized selector sent to class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com