http://www.dreamingwish.com/dream-2012/the-create-the-static-the-library-containing-the-category.html
一、异常的原因
在连接一个含有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。。。
但是这样始终不好,因为这两个选项都可能导致不必要的代码被加载。
三、更好的方法
Three20库给出了一个宏:
#define TT_FIX_CATEGORY_BUG(name) @interface TT_FIX_CATEGORY_BUG_##name @end \
@implementation TT_FIX_CATEGORY_BUG_##name @end
为每个只包含category的文件的category实现前面加上这样一个宏(定义一个空的class),此时不再需要-all_load或者-force_load,因为不存在只包含category的文件。linker的bug也就无从体现。
四、完美的解决方案
就是apple自己想办法解决。。。。
老乔去了,库克请发力。。。
分享到:
相关推荐
Selector
JavaNIO库Selector机制解析.docx
前端开源库-has-id-selector有ID选择器,检查CSS选择器字符串是否有ID。
前端开源库-matches-selector匹配选择器,检查一个DOM元素是否匹配一个给定的选择器,并提供适当的浏览器支持和单元测试。
postcss-selector-not PostCSS插件,将:not() W3C CSS 4级伪类转换为:not()CSS 3级选择器 安装 $ npm install postcss postcss-selector-not 用法 使用此input.css : p : not ( : first-child , . special ) {...
前端开源库-css-selector-extractCSS选择器提取,从CSS代码中提取特定的CSS选择器
一个强大的selector注入器,它可以让view自动产生selector状态,免去了你写selector的麻烦。
python库。 资源全名:appium_selector-1.0.1.tar.gz
对于具有许多类别的博客作者很有用。 如果您有任何疑问或反馈,我是上的 。 您可以通过进行贡献。... ##变更日志### 1.3.0 切换到基于CSS查询的过滤解决方案后,这应该会使事情更高效。 ### 1.2.0 将过滤器框设
Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先需要将插件的依赖项添加到pubspec.yaml文件中,并运行flutter pub get命令获取插件的最新版本。 在插件使用...
Android selector 完整demo
selenium css selector 定位详解
CSS Selector 生成器
带圆角的selector
selectorgadget插件,R语言爬取网页
在simulink上进行BusCreator和BusSelector的简单实验
java selector 测试并发.多线程并发。
Laravel开发-selector 选择器模式抽象类,用于管理用户级或运行时参数上的多态性。
一个关于SocketChannel、ServerSocketChannel、Selector的综合案例
前端开源库-stylelint-selector-bem-patternStylelint选择器BEM Pattern,一个利用PostSS BEM Linter功能的Stylelint插件