问题描述
使用环境:
Xcode 10.1Swift 4.0
描述: 使用 NSCoding 进行 archive 和 unarchive 归档。旧的工程名叫 A, 新的工程名叫 B。A 曾经在设备上运行过,并使用 NSUserDefault 针对序列化后的Data进行持久化保存。 当更换工程名后,B 在运行时从userDefault中取出这个NSData来做解档报错了
'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (MyProject.MyClass) for key (root); the class may be defined in source code or a library that is not linked'
自测后发现
测试过发现了如下问题:
- 使用
OC创建工程,变更工程名之后,调用[NSkeyedUnarchiver unarchiveobject]是没有问题的。 - 在
Swift上发现一定会造成闪退 - ios 11 和 ios 12之后的版本,unarchive 分别添加了一个 函数,用来配合解档失败时候的处理(try catch)
- 看了我们使用的第三方登录/分享的平台,他们也有使用到 归档和解档。只是用的是 OC
原因
When you use the @objc(name) attribute on a Swift class, the class is made available in Objective-C without any names

在Swift环境中,更改Xcode工程名会导致使用NSKeyedUnarchiver解档时崩溃,原因是类的命名空间发生了变化。解决办法包括:1) 使用@objc(name)避免命名空间影响;2) 初始化时不使用业务名作为主Bundle ID;3) 对于已发布应用,可以添加异常处理来避免解档失败时的崩溃。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



