You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动