Xcode里-ObjC, -all_load, -force_load
2016-04-28 11:02
337 查看
c759
在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。
UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个 undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。
在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。
这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。
在64位ios应用环境下,由于链接器的一个bug,在静态库中只有category没有对应的class定义时,-ObjC标志会失效。这时可以使用-all_load强制加载所有目标文件,或者使用-force_load指定加载某一个包。
在Xcode4.2之后,这个链接器bug已经被修复,因此-all_load 和 -force_load标志都不再需要了。在必要时添加-ObjC即可。
在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。
UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个 undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。
在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。
这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。
在64位ios应用环境下,由于链接器的一个bug,在静态库中只有category没有对应的class定义时,-ObjC标志会失效。这时可以使用-all_load强制加载所有目标文件,或者使用-force_load指定加载某一个包。
在Xcode4.2之后,这个链接器bug已经被修复,因此-all_load 和 -force_load标志都不再需要了。在必要时添加-ObjC即可。
相关文章推荐
- iOS UIWebView的基本用法
- Android蓝牙4.0API-类-BluetoothGattCallback
- PS雪碧图快捷键
- JS实现的base64加密解密完整实例
- NSAttributedString那点事
- 使用MySQL Migration Toolkit快速将Oracle数据导入MySQL
- RDD中的转换和action(一)基本函数
- RxJava学习(七)
- hive 分区时 分别使用 年,月,日 来进行分区
- android eclipse jni开发
- Java模版引擎Freemarker
- List的remove方法误区
- #HDU 4325 Flowers 【离散化、区间加减法】
- Onvif 设备发现的多网卡选择问题
- MySQL SQL Error Code : 1175 , 1093 解决方案
- Java工程师成神之路
- sklearn raise ImportError('[joblib] Attempting to do parallel computing n_jobs > 1 windows
- Android图片缓存技术!直接用在你的项目中,简单方便高效
- 在陌生Linux环境查看Tomcat服务的方法
- 近期网友遇到的一些问题,整理出来 大家可以学习 交流 MySQL问题及解答