Swift 环境下变更 Xcode 工程名后使用 NSKeyedUnarchiver 解档引起的崩溃问题

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

使用环境:

  • Xcode 10.1
  • Swift 4.0

描述: 使用 NSCoding 进行 archiveunarchive 归档。旧的工程名叫 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值