IOS 创建含有category的静态库,selector not recognized的解决方案
2015-07-30 22:13
281 查看
一、异常的原因
在连接一个含有category的静态库的时候,往往会得到一个运行时exception “selector not recognized”。这是由于 UNIX的静态库实现、linker和Objective-C的动态结构三者之间的问题引起的。
Objective-C并不为每个函数定义linker symbol,它只为每个class生成linker symbol。(objc的动态结构)
如果你为一个已存在的class创建了category,那么linker并不知道要将原始class实现和category实现联系起来。这就导致了最终程序中的对象没法响应category中的方法。
要解决这个问题,只要在build静态库时,加上linker flag “-ObjC”即可(在64位osx上和iOS程序上,这样做还不够),这个flag告诉linker将每个定义了class或者category的对象文件都载入静态库。
二、iOS程序还需要做的
用xcode4.3创建lib时,-ObjC这个flag默认是有的(之前的版本不记得了,好像4.x版本的都会默认带这个参数),但是最终程序还是会抛这个异常,这是因为linker的bug,对于64位osx程序和iOS程序,这个bug导致只包含category而不包含class的文件没法从静态库中加载。所以,apple建议我们为要最终程序的linker加上-all_load或者-force_load参数。
-all_load选项强制linker加载所有包中的所有对象文件,即使文件中没有Objective-C代码也加载。-force_load是从Xcode3.2开始有的,它使得linker获取包加载的控制权,每个-force_load参数后面都必须跟上一个包的路径,然后这个包的所有对象文件都会被加载。
懒人使用-all_load,勤快人使用-force_load。。。
-force_load $(BUILT_PRODUCTS_DIR)/<library_name.a>
但是这样始终不好,因为这两个选项都可能导致不必要的代码被加载。
三、更好的方法
Three20库给出了一个宏:
四、完美的解决方案
就是apple自己想办法解决。。。。老乔去了,库克请发力。。。
相关文章推荐
- Mac和IOS下使用OpenCV
- iOS开发:StoryBoard 使用Block在两个界面之间传值
- 我在ios开发道路上的学习心得及阶段性收获
- IOS 图片上传处理 图片压缩 图片处理
- 基于Ios的简单点名器程序
- iOS文章
- ios之简单的个税计算器
- IOS计划 分析
- iOS企业级发布
- iOS KVC补充及实例
- IOS第五天(1:取消按钮的监听和设置代理textField字数限制)
- iOS设计模式 - 简单工厂
- iOS设计模式之观察者模式
- iOS--日历事件的获取和添加
- ios实现简单的计算器
- ios 学习感悟
- 提高iOS开发效率的方法和工具
- iOS 图片的处理
- iOS_23_undress Girl
- iOS与服务器的对接