iOS:iOS为什么要用-all_load、-ObjC、-force_load
为了减少工作量复用部分代码,于是乎我们开始选择重构整个项目,把可以公用的代码放在一起打包成一个静态库导入到其他的项目中使用。
介绍这部分内容的文章在网上很多,各位可以Baidu一下细看。
但是每次在加入静态库的时候都会在other linker flag里设置可能需要的三个值:-all_load、-force_load、-ObjC。
很奇怪为什么要这样做,而且有的时候什么都不设置也不影响静态库的使用。
所有使用了这个静态库的项目都没有出现任何的问题,即使不设置那两个flag值。
关于-ObjC的:
Reference:
This flag causes the linker to load every object file in the library that defines an Objective-C class or category.
While this option will typically result in a larger executable (due to additional object code loaded into the application),
it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes.
翻译过来是:
引用
这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。
如果静态库中有类和category分类的话只有加入这个flag才行,也即需要添加的操作如下:

关于-all_load的
Reference:
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.
翻译如下:
引用:
不过在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。
解释:
这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category分类但是没有类的时候,这些category分类还是加载不进来。
变通方法就是加入-all_load或者-force-load。
-all_laod:会强制链接器把目标文件都加载进来,即使没有objc代码。
-force_load:在xcode3.2后可用,而且-force_load后面必须跟一个要加载的静态库的具体路径。
最后总结一下:
-all_load就是会加载静态库文件中的所有成员,
-ObjC就是会加载静态库文件中实现一个类或者分类的所有成员,
-force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员。
所以对于使用runtime时候的反射调用的方法应该使用这三个中的一个进行link,以保证所有的类都可以加载到内存中供程序动态调用。
iOS:iOS为什么要用-all_load、-ObjC、-force_load的更多相关文章
- -all_load,-ObjC,-force_load三者的区别
参考:https://developer.apple.com/library/mac/qa/qa1490/_index.html,http://www.cnblogs.com/YouXianMing/ ...
- Building Objective-C static libraries with categories(ObjC、all_load、force_load)
https://developer.apple.com/library/mac/qa/qa1490/_index.html 之所以使用该标志,和Objective-C的一个重要特性:类别(cat ...
- [IOS]IOS UI指南
[IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...
- 在iOS的XCode工程配置中为什么要用-all_load&-ObjC
-ObjC 这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来.这样编译之后的app会变大(因为加载了其他的objc代码进来).但是如果静态库中有类和categor ...
- iOS NSUserDefaults [setValue:forKey:] [setObject:forKey:] <Objc> setValue(_,forKey:) set(_,forKey) <Swift 3>
前者其实是NSObject都可以调用的KVC方法,后者才是NSUserDefaults的实例方法: 这里参数的类型是nullable id,但是我建议你在传null的时候慎重考虑,否则你的应用就可能面 ...
- [ios]ios tts的使用
参考:http://www.tekuba.net/program/327/ http://blog.sina.com.cn/s/blog_923fdd9b0101flx3.html iOS平台由于本身 ...
- iOS - iOS 应用
1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...
- iOS - iOS 适配
前言 什么是适配: 适应.兼容各种不同的情况. iOS 开发中,适配的常见种类: 1)系统适配, 针对不同版本的操作系统进行适配. 2)屏幕适配,针对不同大小的屏幕尺寸进行适配. iPhone 的尺寸 ...
- [ios]iOS 图形编程总结
转自:http://www.cocoachina.com/ios/20141104/10124.html iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL E ...
- [充电][ios]ios充电接口
知乎推荐:http://www.zhihu.com/topic/19693633/top-answers 外文教学网站: http://www.raywenderlich.com/ 著作权归作者所有. ...
随机推荐
- bzoj 1044 贪心二分+DP
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1044 首先对于第一问,我们可以轻易的用二分答案来搞定,对于每一个二分到的mid值 我们从l ...
- 【Python实例一】使用minidom读取xml文件
前言:最近刚在廖雪峰老师的网站里学习了Python的基础内容,想着循序渐进地找点实例练练手,网上看到有很多相关资料,决定针对感兴趣的内容实际编码实践一下,昨天刚好看到有关使用Python来读取XML文 ...
- django返回二进制图片
@login_required def down_img(request, path): content = Storage().download(path) from django.http imp ...
- Selenium菜鸟手册
转自: http://www.iselenium.com/read.php?tid=458 首先声明我还是一只很菜的菜鸟,学习Selenium一个来月而已,发这个帖子是想利用我这块板砖引出真正的玉来, ...
- [ Python - 15 ] win7安装paramiko问题总汇
安装环境: win7 sp1 python3.5 安装paramiko 新装的win7 sp1 x64位系统,安装好python3.5和pycharm后,需要用到paramiko模块于是开始安装: & ...
- 【 Linux 】三大主流软件负载均衡器对比(LVS、Nginx、HAproxy)
三大主流软件负载均衡器对比(LVS.Nginx.HAproxy) (资料来自网络,做了部分的补充说明) LVS: 1. 抗负载能力强,性能高,能达到F5的60%,对内存和CPU资源消耗比较低 ...
- P1709 [USACO5.5]隐藏口令Hidden Password
P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...
- USACO 2012 Feb Cow Coupons
2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...
- echarts地图自定义任意区域
这里可以直接在地图上框选区域,右侧会自动生成geojson
- java 获取当前系统时间
Java的Date获取时间函数都是deprecated 可以使用: https://stackoverflow.com/questions/5175728/how-to-get-the-current ...