在静态库中链接Objective-C类别
我正在开发一个iOS应用程序的插件。 我正在编译成.a文件,然后由主xcode项目使用。
到目前为止,我已经在这个库中创build了一个UIDevice类的类。 当我使用这个库运行主项目时,由于无法识别的select器而崩溃
– [UIDevice平台]:无法识别的select器发送到实例
平台是我通过类添加的function之一。
所以我认为它根本就没有链接这些函数,并将ac函数添加到与UIDevice类别相同的文件,然后从我的代码中调用它。
这次主项目运行良好…所以我想也许这是我做的其他事情,并删除了C函数。 但是,看到它由于无法识别的select器再次坠毁。
我的问题:为什么xcode忽略类别定义,除非我调用在同一个文件中声明的函数?
是否有一个Xcode设置,我可以改变,使其包括UIDevice类别的这些方法,无论我是否从该文件调用函数?
干杯
查看构buildObjective-C静态库的类别 :
Objective-C没有为每个函数(或Objective-C中的方法)定义链接符号,而是仅为每个类生成链接符号。 如果使用类别扩展预先存在的类,则链接器不知道将核心类实现的对象代码与类别实现关联起来。 这可以防止在生成的应用程序中创build的对象响应类别中定义的select器。
要解决此问题,针对静态库的目标链接必须将-ObjC选项传递给链接器。 该标志使连接器加载库中定义Objective-C类或类别的每个对象文件。 虽然此选项通常会导致更大的可执行文件(由于将其他目标代码加载到应用程序中),但它将允许成功创build包含现有类中的类别的有效Objective-C静态库。
重要说明 :对于64位和iPhone OS应用程序,有一个链接器错误,阻止-ObjC从仅包含类别和类别的静态库中加载对象文件。 解决方法是使用-all_load或-force_load标志。
来源:@albertamg( 链接静态库中的目标C类 )
我曾经也有过一样的问题。 在子项目中定义的类别中定义的方法导致无法识别的select器exception。 (事实上,这performance为无法在Interface Builder中指定UILabel子类; XIB包含IB中显示的类(UILabel或UIView,取决于我在那里拖动的内容),而不是我input的类,看起来像一个奇怪的Xcode错误。)
为我工作的解决scheme一直使用-force_load:
在左侧面板中,select您的主项目(根项目)。 在右边,你会看到PROJECT
和TARGETS
。 selectTARGETS
。 转到“构build设置”(在上面的栏) – “链接” – “其他链接器标志”,假设你的子项目被称为XXXXX, -force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a
在那里添加-force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a
(该项目有两个子项目,debugging和发布,但是你点击这个复合项目,以便如果同时影响debugging和发布)。
请注意,-force_load适用于单个库,您可能需要为每个子项目库指定一个单独的-force_load。
我有这个问题,花了近1个小时来解决它。 感谢上帝! 已经完成了。 定义的方法应该是静态types!