unrecognized selector sent to class 问题解决

4,636 阅读3分钟

#unrecognized selector sent to class 问题解决

unrecognized selector sent to class 

Xcode9作为最新的iOS的开发工具,相信很多小伙伴们都已经安装了, 大家对于各种兼容和bug修改头都大了吧.

本来,我还真的没有遇到过Xcode找不到文件或者方法的问题.

之前有写过一个demo并上传到gitHub上面, 有朋友下载下来想要使用, 于是他将几个.h和.m等文件合并在一个文件夹内,直接放到项目中, 然后运行就崩溃了

于是就issues告诉到我,我开始以为是他没有在使用的地方引用项目文件, 他却说已经引用了,并且方法名 方法都能调用, 编译都没有问题,但是一运行就报错了

我也蒙了,于是索要了一个问题demo, 拿过来一看,跟我之前的项目没有任何代码区别,仅仅是他将部分代码文件合并放在一个文件夹中.

于是编译运行,崩溃了,

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIBarButtonItem itemWithTarget:action:image:]: unrecognized selector sent to class 0x104e51c20'

出现了这样的日志, 很明显的原因就是一个没有找到该类的方法或者文件,

于是基于以前开发的经验,

  • 解决方法1:

前往targets的building setting 的Other Linker flags 添加以下两项 -all_load -ObjC

如果还是不行的话,就把你需要添加的文件直接拖到该项中,手动关联即可 你之前的问题,就是因为这个引起的,只要在Other Linker flag 添加需要相应的文件路径即可 类似这样

这里写图片描述

再次编译运行,果然,项目顺利运行了, 于是将解决方案告知朋友,

然后令我崩溃的事情出现了

朋友说手抖删掉了某一个添加的索引,然后自己就不会添加了..

心中很是无语,告诉了方法之后,我又开始思考.这样的问题如果这么容易出现,每个文件都需要手动添加索引的话,不就太麻烦了吗? other link flags 很多人都知道,项目中添加某些静态库可能会需要设置这个,但是一般是不需要的,不可能一个文件夹就能影响这么大的

  • 解决方法2:

于是想到是否是因为文件没有包含到对应的target中?

这里写图片描述
添加文件的时候明明已经add to targets了, 但是进去项目中,查看.m文件.果然,朋友的文件中不能运行代码的文件就是缺少了这个,对比项目中的其他文件,仅仅是缺少这个勾选 于是勾选target membership,果然编译运行都好了
这里写图片描述

不需要一个一个文件手动添加索引了,只需要勾选一下即可 看来这个才是最好的解决方法.

这个应该是Xcode9的一个bug. 最起码我之前没有遇到过.....

于是在此记录一下这个问题,第一时间告诉到朋友,并分享给大家,方便大家遇到类似的问题能够找到解决方案