代码改变世界

IOS - 关于Xcode中refactor的子项rename后,出现“unrecognized selector sent to instance”异常

2015-08-26 11:16  HermitCarb  阅读(928)  评论(0编辑  收藏  举报

这几天在重构项目的数据库,然后学会了使用refactor中的rename,用着真是方便,但是其中也出现了些棘手的问题,其中最恶心的就是“unrecognized selector sent to instance”异常了。

 

我的状况是(非频发的):对一个interface重命名后,其中的一个方法不能执行,报上面的异常后闪退,断点时发现是有个方法没有被调用。网上搜,都是说调用这个方法的实例被提前释放了,又说到retain。

呃,这方案好像是比较早的版本了,首先IOS5就已经推出了ARC了,其次,我断点时发现实例没有被释放。

 

明明有那个方法,Ctrl+左键也能导航到.h文件中的函数上,但就是执行时找不到那个函数。纠结了好久:撤回所有操作,clean,(build,)run,Exception,撤销所有操作,clean……

 

其中有一个值得一说的现象:因为编译时没有错误,所以我尝试着(在运行后会出现此异常的情况下)再rename这个函数,此时左侧文件导航处没有显示同名的.m文件,也就是说没有在同名的.m文件中发现这个函数(尽管是有的)。(此时如果不仔细查看,就可能会漏过.m文件中的函数名的修改。)

 

然后尝试下面的步骤解决了问题:

开始状态:rename后,run项目时出了错误。

1.clean项目,建议,个人习惯先清理一下缓存。

2.注释掉.h和.m文件中的找不到的那个方法。

3.(build)run项目,肯定会报错,没关系,就是让它重新生成错误信息。

4.clean项目,重新写一遍刚注释掉.h和.m文件中的找不到的那个方法(复制也行,我是先写函数名,然后复制的函数体)。

5.(build)run项目,这个时候就没了错误。

 

说明:这是偶然发生的一次事件,不具有代表性,我也没有太多机会检查这次错误发生的原因,也没有机会验证我的解决方法的合理性。仅供参考吧

 

----------------

对于上面rename的一点新发现:

当我对另一个interface重命名后,在再对其中的一个属性进行重命名时发现左侧文件导航处没有显示同名的.m文件,赶紧通过上面方法解决了问题,然后clean,build,又对另一个interface重命名后对其中的一个属性进行重命名,又是在左侧文件导航处没有显示同名的.m文件。

估计是IDE中关于项目的一些缓存没有被更新吧。