-ObjC ,-all_load,_force_load的使用场景,用法和区别

本文介绍了在iOS项目中集成静态库时遇到的问题及解决方案,特别是-ObjC、-all_load和-force_load的使用场景和区别。在遇到静态库重复引用和类别加载问题时,通过合理设置Other Linker Flags可以避免这些问题。文章最后详细解释了-all_load和-force_load的用途,以及它们与-ObjC的区别。

一直没有足够的动力写一篇博客,尤其是在如此的深夜,安静的夜给我安静的大脑…其实我要说的是这是我第一篇正式技术博客,时间:深夜. 最近项目要求使用到 cordova实现 JS 和 Native的通信,于是我要集成 cordova到一个纯 OC写的项目中,具体什么是 cordova,怎么集成,有兴趣的可以自行百度或谷歌,在这就不多啰嗦了,为什么?看标题.

集成静态库
一般集成静态库的步骤很简单
1.将要集成的库文件拖入项目
2. link Binary中添加关联
当然这是最理想的静态库,也是我们最想要的步骤 ,但是这种情况很少.多数情况下我们都需要在 Build Setting的 Other link flag 中添加 -ObjC (注意是大写的 C,如果用小写的时候又时候是不灵的),-all_load, -force_load 等等 flag,如图
这里写图片描述

走到这一步也算差不多了,运行一下试试,如图
这里写图片描述

我擦,这是什么鬼,其实我一开始遇到的错误比这个要壮观的多,当时我就傻了,提示有8个重复引用,(8 duplicate),10+个 not found,网上搜索一下,答案都很直接,重复引用的需要经过自行筛选留下一个(stackoverflow如是说),not found的文件要从 search path移除,就是这些鬼
这里写图片描述

于是我一个个找到移除了,确实 warning少多了,这个问题就算暂时解决了吧,但是更大的问题是重复引用的,因为那几个第三方静态库的文件都不可以删,项目中都要引用的,删除任何一个都是不合理的行为,经过各种搜索,终于想到了,如果我只 load这一个静态库的文件不就解决重复引用的问题了吗,为此我将 Other link flag 改为如下图
这里写图片描述
运行
这里写图片描述

这是我的最后成果,(-ObjC我直接加到 Cordova.project上了)-force_load是可以指定一个库文件建立这个 flag的,也就是说其他的库文件在编译的时候不会受到影响.
这东西并不难,但在遇到情况的时候,我们往往是不知道答案的,某些有经验的人来说,这都不算事,但还有一部分人对这些东西是不甚了然的,看了这篇文章,希望能帮助到他们少走一些弯路.

最后写出 这三个 flag的区别,供大家查看.理解

  1. -all_load _force_load 的区别:

-all_load
IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code. -force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive, and every object file in that archive will be loaded. 这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_laod会强制 链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。
-force_load
When someone uses “-all_load”, every imported library is forced into memory whether its needed or not. A much better technique is “-force_load”: -force_load $(BUILT_PRODUCTS_DIR)/libarc.a This insures that ONLY your library is loaded, not every library.

2 . ObjC:

Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现”selector not recognized”,也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值