iOS 13 Beta中NSKeyedUnarchiver崩溃求助(iOS12正常)
iOS 13 Beta下NSKeyedUnarchiver崩溃排查与解决
问题背景
我最近在适配iOS 13 Beta版本时遇到了一个棘手的问题:原本在iOS 12.x及更低版本运行完全正常的代码,在调用NSKeyedUnarchiver读取本地.dat文件里的自定义NSCodable对象数组时,突然出现了崩溃。
崩溃细节
触发崩溃的代码行:
objects = [NSKeyedUnarchiver unarchiveObjectWithFile:path];控制台抛出的异常信息:
...uncaught exception 'NSInvalidArgumentException', reason: -[Object initWithCoder:]: unrecognized selector sent to instance *
注:
objects是自定义对象数组,Object是我定义的数据类,*为对应实例的内存地址,且我已确认传入的文件路径是完全有效的。
排查过程与解决方案
经过反复测试和排查,终于定位到问题核心:我的自定义类名Object和iOS 13 Beta中某私有框架的类名重名了!
运行时编译器无法正确区分应该使用哪个类,错误地尝试用系统私有类去执行initWithCoder:方法,但该私有类并没有实现这个初始化方法,直接导致了崩溃。
解决步骤非常直接:
- 给自定义类重命名(比如改成
AppCustomDataObject这类不会和系统类冲突的名称) - 使用新类重新序列化对象并保存到新文件中
个人推测
按照常规的类加载优先级,我们自定义的类应该优先于系统私有框架的类被识别,这次崩溃大概率是iOS 13 Beta版本的一个兼容性异常问题,推测正式版会修复这个类优先级判断的bug。
内容的提问来源于stack exchange,提问作者a_hausb




