突然发现如果我在键盘出现的状态下,按下Home键使得App从Foreground切换到Background的时候,App就会触发一个exception导致crash,这个crash的信息在我看来很奇怪。
[UIKeyboardLayoutStar release]: message sent to deallocated instance
最开始,我想,干脆去掉这个库,不用了。去掉后,发现运行App就出错,出错的原因是某处代码会把nil给设置到NSMutableDictionary中,而NSMutableDictionary不能储存nil。结果,我还不能直接把该库给从工程中移除。
最后想想,怎么办呢,看来只能改一改代码了。
首先第一步,需要确定该改哪里,接下来就要确定该怎么改。
经过一阵子的comment/uncomment操作,最终发现,如果不swizzle NSArray的objectAtIndex,App就不会出现UIKeyboardLayoutStar的exception。
该怎么改呢?有一个经验,就是,涉及比较多runtime的代码,最好不要用arc,所以我决定把我司用到的几个文件改为MRC。
仔细看了那几个文件,发现还是比较好改的。只需要做如下改动就行了
- 初始化所有的NSError变量声明,原代码都是NSError *err;的形式,在ARC下没问题的,compiler都给自动初始化为nil了,但是MRC下不行
- 把NSError从函数返回的时候,加上autorelease
按照上面两点改好后,再到build phase里给那几个m文件加上-fno-objc-arc flag
接下来又测试了几次,UIKeyboardLayoutStar release这个exception没有再出现,问题解决。
顺便再多说几句,DurexKit的作者也提到了某几个文件不要用ARC。
2014-04-09 17:48:58@habib狂鳄– : 这两个发现一个缺陷,已经修正了,请试一下最新版,最新版如果用源码需要把NSObject+SafeKit标记为-fno-objc-arc,或者直接用静态库
不过作者所指的那个文件不能解决我这个问题,因为本文的问题是由于swizzle了NSArray的方法引起的,而不是NSObject。