Objective-C加载方式讨论

本文整理自http://www.jianshu.com/p/8b26915cb1e6

在unix系统下,不管是静态库还是动态库都会为每个函数生成链接符号,而Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这也是OC的动态特性决定的。在OC中,当在一个静态库中使用类别来扩展已有类的时候,编译器不会去链接一个仅仅只包含categories的文件 ,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-Obj-C标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。说到这呢你是不是认为-Obj-C就能搞定一切了呢?错!在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。这就是为什么我们经常会-ObjC和-all_load一起用了。

举例如下:

IQKeyboardManager的IQUIWindow+Hierarchy.m文件中,代码如下:

IQ_LoadCategory(IQUIWindowHierarchy)

IQ_LoadCategory的定义如下:

#define IQ_LoadCategory(UNIQUE_NAME) @interface FORCELOAD_##UNIQUE_NAME :NSObject @end @implementation FORCELOAD_##UNIQUE_NAME @end

IQUIWindow+Hierarchy.m是类别文件,如果没有加-ObjC和-all_load就不会编译进去,作者为了确保不出问题,定义了一个宏,这个宏呢定义了一个假的类,这个假的类就会让链接器把这个文件编译进去。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值