iOS 关于Other Linker Flags的作用

在用第三方库时,我们常常在Xcode的Build SettingsOther Linker Flags里面加入-ObjC标志,它和Objective-C的一个重要特性:类别(category)有关

根据官方的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。

为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的 Objective-C代码都加载进来。可以看出,使用-ObjC可能会链接很多静态库中未被使用的Objective-C代码,极大的增加APP的代码体积。
不要以为这样就可以解决所有问题了,在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。
变通方法是使用-all_load或者-force_load标志,它们的作用都是强制链接器把目标文件都加载进来,即使没有objc代码,不过-all_load作用于所有的库,而-force_load后面必须要指定具体文件加载的位置

Flags 位置 作用
-ObjC Other Linker Flags 链接静态库中所有的Objective-C代码到APP
-all_load Other Linker Flags 全加载,链接静态库中所有的代码到APP,无论是cc++还是oc
-force_load Other Linker Flags 链接指定静态库中所有的代码到APP,无论是cc++还是oc
-------------本文结束感谢您的阅读-------------
最近的文章

iOS 面试题-2019.上

UIView和CALayer是什么关系 UIView继承自UIResponder类,可以响应事件 CALayer直接继承自NSObject类,不可以响应事件 UIView是CALayer的delegate(CALayerDelegate) UIView主要处理事件,CALayer负责绘制 每个 …

代码库 继续阅读
更早的文章

iOS 使用Jenkins持续集成(简称CI)

安装jenkins1.1. 直接到官网下载安装包,通过安装包安装1.2. 通过Homebrew使用命令行安装1234561. 安装Homebrew$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst …

代码库 继续阅读