objective-c - 在单独的文件中阐明Objective-C类别

标签 objective-c crash categories

我已按类别向引擎中的现有类添加了一些方法。此类别在我的单独文件中声明和实现。然后,我包含这些文件(但所有引擎文件均保持不变,因此引擎中仅包含原始声明)。引擎内置于静态库中,并与我的应用程序链接。当我调用某个类别的方法时,应用程序崩溃,错误为“无法识别的选择器已发送至实例...”。但是,如果我使用原始引擎类在文件中声明类别,则一切正常。

如果类别选择器在单独的文件中声明和实现,为什么不能识别类别选择器?包含文件的顺序重要吗?

最佳答案

这是一个链接器错误,其中在其自己的编译单元中声明的类别方法未正确链接到应用程序中。请在此处查看来自Apple的技术说明:

Building Objective-C static libraries with categories

您必须在应用程序中指定链接器标记-all_load,否则“hacky”技术将是定义一个宏,该宏将定义一个虚拟类和实现,并在每个类别实现中调用该宏:

#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)
// ...

关于objective-c - 在单独的文件中阐明Objective-C类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029921/

相关文章:

objective-c - 如何在我的 iphone 应用程序中将所有信息容纳在一个表格单元格中?

ios - didMoveToSuperview 没有被调用

crash - NewRelic因EXC_BAD_ACCESS而崩溃

cocoa - cocoa 中的类别和单例

objective-c - 在 Objective-C 中定义协议(protocol)的类别?

iphone - 是否可以仅使用 C++ 制作 iPhone 应用程序?

iphone - 如何在iphone中播放MID文件?

C++ 数组调整大小崩溃

linux - mmap()之后,写入返回地址可以,但是读取会导致系统崩溃。为什么?

iphone - Objective-C静态库类类别,重写方法不起作用