2012-05-04 31 views
12

我正在使用一些第三方软件来帮助使用Xcode 4.3.2编写iPad应用程序。该软件是开源的,通常会进行设置,以便将其代码与开发人员为应用程序编写的任何代码一起编译。因为我在很多地方都使用这个软件,所以我决定把它建立为iOS模拟器的静态库。静态iOS库中无法识别的选择器调用类别方法

我能够构建库,并将一个应用程序转换为链接到该库,而不是编译原始源代码。但是,当我在模拟器上运行应用程序时,出现一个错误,说明无法识别的选择器发送到实例

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

我使用'nm'命令来验证静态库中存在的类别方法。下面是输出的一个例子:

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

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

+3

添加-ObjC链接器标记如下解释:HTTP://计算器.com/questions/2567498/objective-c-categories-in-static-library –

+0

-load_all也可以。 – CodaFi

+0

[在静态库中链接目标-c类别]的可能重复(http://stackoverflow.com/questions/6820778/linking-objective-c-categories-in-a-static-library) –

回答

24

您的第三方框架可能使用现有(苹果)类中的类别。但是加载/找到你需要添加-ObjC国旗在构建设置下的类别Other Linker Flags

buildsettings

+1

作为链接器标志包含-Objc这个技巧。谢谢。 –

+2

这必须在使用库的目标的链接器设置中进行设置,而不是在库本身中进行设置。 – Krejko

+1

请记住它是-ObjC而不是-Objc –

3

Pfitz答案是伟大的,但这样会导致编译器将一堆没有用的二进制文件加载到您的项目这不是你想要的。请参考此答案知道为什么https://stackoverflow.com/a/22264650/1363997

这里是最好的解决办法:

1)选择您项目从左侧面板目标(文件夹导航器)
2)选择“构建阶段”自来水
3)扩大“编译源”细胞
4)打的加号按钮在底部,然后添加类别的.m文件

完成!

注意:你必须通过你自己的文件夹导航到搜索文件,不要在搜索字段中键入文件名

+1

这不仅仅是有效地将.m文件复制到项目中,而是首先解决了将代码封装在静态库中的问题? – devios1

+0

我已经有了-ObjC标志,并且-load_all也没有解决它的问题。这样做。谢谢。 –

相关问题