导航

使用Category构建Objective-C静态库

Posted on 2012-06-05 11:57  残影无伤  阅读(515)  评论(0)    收藏  举报

使用Category构建Objective-C静态库

Q: 在链接包含 Category的静态库时会收到“Selector not recognized”运行时异常,Why?

A: 发生这个异常,主要是由于标准Unix静态库,链接器的实现方式以及Objective-C动态特性导致的。Objective-C不会为每一个Objective-C函数生成链接符号,相反,它会为每一个类生成链接符号。如果你通过category对一个既有的类进行扩展,那么链接器就不知道如何把原有的代码与category的代码实现关联起来,这就导致生成的对象无法响应属于category的消息。

要解决这个问题,生成链接该静态库的可执行文件时必须在链接器加入-Objc选项。这个选项会促使链接器加载库中所有定义了Class和Category的文件。但这些额外的代码会使目标文件变大。

 

添加-objc选项方法如下:

在Xcode中点击工程文件,右边选择targets下目标文件,在搜索栏中输入“Other Linker Flags”,搜索,知道相关选项设置,加入-objc。

在64位和iOS应用程序中,linker有一个bug,这个bug会导致objc选项无效,无法从静态库中加载只定义了Category的文件 ,这就需要添加-all_load或-force_load选项。