0

我成功创建了一个包含 LRResty API 以及我自己的许多类、函数等的 iOS 静态库。为了尝试测试我的库,我将它与库头文件一起复制到了一个新的 Xcode 项目中。在这个新的 Xcode 项目中,我调用了我的一个函数,该函数最终调用了 LRResty 函数 [LRRestyClient get:withBlock:]。然后抛出异常 NSInvalidArguementException unrecognized selector sent to instance。有趣的是,我可以右键单击函数(在静态库中)和“跳转到定义”,它知道函数定义的位置。

我知道这个异常可能有很多原因,有谁知道它可能是什么?如果此描述过于模糊,我很乐意提供更多信息。或者任何人都可以向我解释如何将 LRResty 库成功打包到 iOS 静态库中?然后,我将使用此过程将其余的源文件打包在其中。

注意:我是创建静态库的新手,所以我可能忽略了一些非常简单的事情。我按照本教程创建了我的静态库: http: //www.icodeblog.com/2011/04/07/creating-static-libraries-for-ios/

感谢帮助。

4

1 回答 1

0

问题是 LRResty 库使用类别的结果。为了解决这个问题,我必须将编译器标志 -ObjC 和 -all_load 添加到构建目标的Other Linker Flags部分。注意:这些编译器标志已添加到使用我创建的库的示例应用程序中。因此,任何使用我的库的应用程序都必须插入这些编译器标志。

以下是有关在 iOS 静态库中使用类别的更多信息:

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

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

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

上面的信息是从这个Stackoverflow答案中检索到的。

于 2013-02-26T20:40:54.503 回答