【问题标题】:Clarify Objective-C categories in separate file在单独的文件中阐明 Objective-C 类别
【发布时间】:2011-05-17 11:07:52
【问题描述】:

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

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

【问题讨论】:

  • 您是如何声明类别的?您能否添加一些代码,以便我们可以看到您已正确声明它?

标签: objective-c crash categories


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您需要为链接器设置一些标志...有关详细信息,请参阅What does the -all_load linker flag do?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多