2011-05-17 29 views
1

我已经按类别向引擎中的现有类添加了一些方法。这个类别是在我单独的文件中声明和实现的。然后我包含这些文件(但所有引擎文件保持不变,因此只有原始声明包含在引擎中)。引擎被构建到静态库中并与我的应用程序链接。当我调用我的类别的方法时,应用程序崩溃,出现错误“无法识别的选择器发送到实例...”。但如果我用原始引擎类声明文件类别的所有作品。在单独的文件中阐明Objective-C类别

为什么类别的选择器如果在单独的文件中声明和实现,则无法识别?包含文件的顺序是否重要?

+0

你是如何申报这个类别的?你可以添加一些代码,以便我们看到你已经正确地声明了它吗? – Abizern 2011-05-17 11:19:30

回答

3

这是一个链接器错误,其中在自己的编译单元中声明的类别方法未正确链接到应用程序中。从这里苹果参见技术说明:

Building Objective-C static libraries with categories

必须要么在应用程序中指定链接标志-all_load,或“哈克”的方法是定义一个宏将定义一个虚拟的类和实施,并呼吁在每个类别中实现宏观:

#define FIX_CATEGORY_LINKER_BUG(name) \ 
    @interface FIX_CATEGORY_LINKER_BUG_##name @end \ 
    @implementation FIX_CATEGORY_LINKER_BUG_##name @end 

和上面的类别执行如下命令使用它:

FIX_CATEGORY_LINKER_BUG(NSStringMyAdditions) 

@implementation NSString (MyAdditions) 
// ...