我已经按类别向引擎中的现有类添加了一些方法。这个类别是在我单独的文件中声明和实现的。然后我包含这些文件(但所有引擎文件保持不变,因此只有原始声明包含在引擎中)。引擎被构建到静态库中并与我的应用程序链接。当我调用我的类别的方法时,应用程序崩溃,出现错误“无法识别的选择器发送到实例...”。但如果我用原始引擎类声明文件类别的所有作品。在单独的文件中阐明Objective-C类别
为什么类别的选择器如果在单独的文件中声明和实现,则无法识别?包含文件的顺序是否重要?
我已经按类别向引擎中的现有类添加了一些方法。这个类别是在我单独的文件中声明和实现的。然后我包含这些文件(但所有引擎文件保持不变,因此只有原始声明包含在引擎中)。引擎被构建到静态库中并与我的应用程序链接。当我调用我的类别的方法时,应用程序崩溃,出现错误“无法识别的选择器发送到实例...”。但如果我用原始引擎类声明文件类别的所有作品。在单独的文件中阐明Objective-C类别
为什么类别的选择器如果在单独的文件中声明和实现,则无法识别?包含文件的顺序是否重要?
这是一个链接器错误,其中在自己的编译单元中声明的类别方法未正确链接到应用程序中。从这里苹果参见技术说明:
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)
// ...
您需要为链接器设置一些标志...详情请参阅What does the -all_load linker flag do?。
你是如何申报这个类别的?你可以添加一些代码,以便我们看到你已经正确地声明了它吗? – Abizern 2011-05-17 11:19:30