【问题标题】:linking objective-c categories in a static library在静态库中链接 Objective-C 类别
【发布时间】:2011-10-12 20:12:56
【问题描述】:

我正在为 iOS 应用程序开发一个插件。我正在将它编译成一个 .a 文件,然后由主 xcode 项目使用。

到目前为止,我已经在这个库中创建了 UIDevice 类的类别。当我使用这个库运行主项目时,由于无法识别的选择器而崩溃

-[UIDevice 平台]:无法识别的选择器发送到实例

平台是我通过类别添加的功能之一。

所以我认为它根本没有链接这些函数,并将一个 c 函数添加到与 UIDevice 类别相同的文件中,然后从我的代码中调用它。

这次主项目运行良好......所以我想也许是我做了其他事情并删除了 C 函数。但是你瞧,它又因为无法识别的选择器而崩溃了..

我的问题: 为什么 xcode 会忽略类别定义,除非我调用在同一个文件中声明的函数?

是否有我可以更改的 xcode 设置以使其包含 UIDevice 类别中的这些方法,无论我是否从该文件调用函数?

干杯

【问题讨论】:

标签: ios xcode linker categories


【解决方案1】:

查看Building Objective-C static libraries with categories:

Objective-C 没有为每个函数定义链接器符号(或 方法,在 Objective-C 中) - 相反,仅生成链接器符号 对于每个班级。如果您使用类别扩展预先存在的类, 链接器不知道关联核心的目标代码 类实现和类实现。这可以防止 在生成的应用程序中创建的对象从响应 在类别中定义的选择器。

为了解决这个问题,目标链接到静态库 必须将 -ObjC 选项传递给链接器。 此标志会导致链接器 加载定义Objective-C的库中的每个目标文件 类或类别。虽然此选项通常会导致更大的 可执行文件(由于加载到 应用程序),它将允许成功创建有效的 包含现有类别的 Objective-C 静态库 类。


重要提示:对于 64 位和 iPhone OS 应用程序,有一个 阻止 -ObjC 从静态加载对象文件的链接器错误 仅包含类别而不包含类的库。解决方法 是使用 -all_load 或 -force_load 标志。

来源:@albertamg (linking objective-c categories in a static library)

【讨论】:

  • 感谢您的快速回复!我在两个项目中都添加了链接器标志,但仍然出现相同的错误。但是,应用程序的文件大小已经超出了应有的大小,因此在这种情况下,调用虚拟函数可能是最好的解决方案。
  • @micken 重要提示:对于 64 位和 iPhone OS 应用程序,存在阻止 -ObjC 从仅包含类别且不包含类的静态库加载对象文件的链接器错误。解决方法是使用 -all_load 或 -force_load 标志。
  • 这个错误至今还存在吗?
  • 这似乎不再是 Xcode 4.5.2 和 iOS 6.0 的问题。只需 -ObjC 标志就足够了。
  • 谢谢您,这对我们非常有用。我们竭尽全力试图弄清楚为什么在运行时找不到类别中的方法。尝试了所有其他可能的方法。它起作用的唯一方法是在与原始类相同的文件中定义类别时,这是不可接受的,因为不同的文件可见性(公共与项目)。
【解决方案2】:

我也遇到了同样的问题。在子项目中定义的类别中定义的方法导致无法识别的选择器异常。 (实际上,这表现为无法在 Interface Builder 中指定 UILabel 子类;XIB 包含 IB 中显示的类(UILabel 或 UIView,取决于我在那里拖动的内容),而不是我输入的类,并且看起来像一个奇怪的 XCode 错误。)

对我有用的解决方案是使用 -force_load:

在左侧面板中,选择您的主项目(根项目)。在右侧,您将看到PROJECTTARGETS。选择TARGETS。 转到“构建设置”(在上栏中)-“链接”-“其他链接器标志”,假设您的子项目名为 XXXXX,添加 -force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a 那里(该项目有两个子项目,Debug 和 Release,但您单击此复合项目,以便影响 Debug 和 Release)。

请注意,-force_load 适用于单个库,您可能需要为每个子项目库指定单独的 -force_load。

【讨论】:

  • 我收到“libtool: unknown option character `f' in: -force_load”的错误有什么想法吗?
【解决方案3】:

我遇到了这个问题,花了将近 1 个小时来解决它。感谢上帝!它已经完成了。定义的方法应该是静态类型!

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2012-02-15
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2012-09-30
    • 2017-01-31
    相关资源
    最近更新 更多