【iOS开发】使用扩展方法时出现"selector not recognized" runtime exceptions的解决方案

来源:互联网 发布:sketch中文版软件 编辑:程序博客网 时间:2024/06/07 02:08

最近在编写iOS的framwork库的时候,遇到这样一个问题:
如果在编写framework库的时候使用到category methods(扩展方法),在引用我们编译好的framework库的时候,可能会报出这样的错误:

selector not recognized

这是因为Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数定义链接符号,它只为每个类创建链接符号。
这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现”selector not recognized”,也就是找不到方法定义的错误。

根据官方文档给出的建议,我们可以这样解决这个问题:
在项目(我们实际运行的工程,不是framework库的工程)的 build setting 中找到 other linker flags ,添加$(OTHER_LDFLAGS) -ObjC.这个编译选项,他会告诉编译器编译的时候要整合我们扩展的方法。


值得一提的是,如果你的项目引用了多个库,并且这些库之间有互相的依赖的时候,添加了上面这句编译提示后,编译会变得严格,系统将检测出重复引用的那些库,并且提示编译不通过。这就要求我们在我们的framework库中删掉重复引用的部分,比如:

A.framework与B.framework同时引用了C.framework,此时应该在A中删除对C的引用,并将A的引用指向B,这样来保证不出现重复的引用。

感谢阅读!

阅读全文
0 0
原创粉丝点击