【问题标题】:Unrecognized selector calling category method in static iOS library静态iOS库中无法识别的选择器调用类别方法
【发布时间】:2012-05-13 15:12:18
【问题描述】:

我正在使用一些第三方软件来帮助使用 Xcode 4.3.2 编写 iPad 应用程序。该软件是开源的,通常经过设置,因此其代码将与开发人员为应用程序编写的任何代码一起编译。因为我在很多地方都在使用该软件,所以我决定将它构建为 iOS 模拟器的静态库。

我能够构建库,并将一个应用程序转换为链接到该库,而不是编译原始源代码。但是,当我在模拟器上运行应用程序时,我收到一条错误消息,提示 unrecognized selector sent to instance

我已验证该程序已成功使用部分静态库。但是,有一段代码尝试调用对象上的方法,并且发生故障。被调用的方法实际上并未在该对象的接口中定义。相反,它是在为该对象的类定义类别的附加模块中提供的。该模块的头文件已正确包含,编译器应该能够找到类别方法并将其应用于对象,但在运行时,出现上述错误。

我使用“nm”命令来验证静态库中是否存在类别方法。以下是输出示例:

nm libStaticLibrary.a | grep categoryMethod
00000130 t -[SomeClass(Category) categoryMethod:]
0000354c s -[SomeClass(Category) categoryMethod:].eh

对于如何使这个库与所需的应用程序正常工作,人们有什么想法?

【问题讨论】:

标签: objective-c ios unrecognized-selector


【解决方案1】:

您的第 3 方框架很可能使用现有(苹果)类上的类别。但是要加载/查找类别,您需要在 Other Linker Flags 下的构建设置中添加 -ObjC 标志

【讨论】:

  • 这必须在使用库的目标的链接器设置中设置,而不是在库本身中。
  • 记住它是 -ObjC 而不是 -Objc
  • 你救了我很多。
  • 它在我的项目中不起作用。我已经导入了类别标头,但没有在目标编译源中包含相应的 .m。构建成功,但在运行时崩溃。
【解决方案2】:

Pfitz 的回答很好,但这会导致编译器将一堆未使用的二进制文件加载到您的项目中,这不是您想要的。请参考这个答案知道为什么https://stackoverflow.com/a/22264650/1363997

这是最好的解决方案:

1) 从左侧面板(文件夹导航器)中选择您的 项目 目标
2)选择“构建阶段”点击
3)展开“编译源代码”单元格
4) 点击底部的加号按钮,然后添加您的类别的 .m 文件

完成!

注意:您必须通过自己在文件夹中导航来搜索文件,不要在搜索字段中输入文件名

【讨论】:

  • 这不是有效地将 .m 文件复制到项目中,首先将代码封装在静态库中吗?
  • 我已经有了 -ObjC 标志,而 -load_all 也没有解决问题。这做到了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多