我成功创建了一个包含LRResty API的iOS静态库以及我自己的许多类,函数等。为了尝试测试我的库,我将它与库头文件一起复制到一个新的Xcode项目中。在这个新的Xcode项目中,我调用了一个最终调用LRResty函数的函数[LRRestyClient get:withBlock:]。然后抛出异常NSInvalidArguementException无法识别的选择器发送到实例。有趣的是,我可以右键单击该函数(在静态库中)和“跳转到定义”,它知道函数定义所在的位置。
我知道可以抛出这个异常有很多原因,有没有人知道它可能是什么?如果这个描述太模糊,我很乐意提供更多信息。或者有人可以向我解释如何将LRResty库成功打包到iOS静态库中吗?然后我将使用此过程将其余的源文件打包到其中。
注意:我是创建静态库的新手,所以它可能是我忽略的非常简单的东西。我按照本教程创建了我的静态库:http://www.icodeblog.com/2011/04/07/creating-static-libraries-for-ios/
感谢帮助。
答案 0 :(得分:0)
问题是LRResty库使用类别的结果。为了解决这个问题,我不得不将编译器标志-ObjC和-all_load添加到构建目标 Other Linker Flags 部分。注意:这些编译器标志已添加到我的示例应用程序中,该应用程序正在使用我创建的库。因此,任何使用我的库的应用程序都必须插入这些编译器标志。
以下是有关在iOS静态库中使用类别的更多信息:
Objective-C没有为每个函数(或Objective-C中的方法)定义链接器符号 - >相反,仅为每个类生成链接器符号。如果使用>类扩展预先存在的类,则链接器不知道将核心类实现>的对象代码与类别实现相关联。这可以防止在生成的应用程序中创建的对象>>响应类别中定义的选择器。
要解决此问题,针对静态库的目标链接必须将-ObjC选项>传递给链接器。此标志使链接器加载库中定义> Objective-C类或类别的每个目标文件。虽然此选项通常会产生更大的可执行文件(由于>加载到应用程序中的其他对象代码),但它将允许成功创建包含现有类的类别的>有效Objective-C静态库。
重要:对于64位和iPhone OS应用程序,有一个链接器错误阻止-ObjC从>加载来自仅包含类别而没有类的静态库的对象文件。 >解决方法是使用-all_load或-force_load标志。
从此Stackoverflow答案中检索到的上述信息。