首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

错误"[general] *-[forKey validateAllowedClass:NSKeyedUnarchiver:]允许取消存档...“

错误"[general] *-[forKey validateAllowedClass:NSKeyedUnarchiver:]允许取消存档..."通常发生在iOS开发中,当你尝试使用NSKeyedUnarchiver解码(unarchive)一个对象时,如果该对象的类不在允许的类列表中,就会出现这个错误。

基础概念

NSKeyedUnarchiver是iOS中的一个类,用于从二进制数据中解码对象。它通常用于解码之前使用NSKeyedArchiver编码的对象。为了安全起见,NSKeyedUnarchiver允许开发者指定一组允许解码的类,以防止恶意代码执行。

问题原因

这个错误通常是由于以下原因之一引起的:

  1. 类定义缺失:在解码时,某个类的定义不存在或未正确导入。
  2. 允许的类列表不正确:在解码时,指定的允许类列表中缺少了某个必要的类。
  3. 版本不兼容:编码和解码过程中使用的类版本不一致。

解决方法

以下是一些解决这个问题的常见方法:

1. 确保类定义存在并正确导入

确保所有需要解码的类都已经定义,并且在项目中正确导入。例如:

代码语言:txt
复制
import UIKit

2. 指定正确的允许类列表

在解码时,明确指定允许的类列表。例如:

代码语言:txt
复制
let allowedClasses: [AnyClass] = [MyClass.self, AnotherClass.self]
if let data = Data(), let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data), unarchiver.allowedClasses = allowedClasses {
    let decodedObject = unarchiver.decodeObject(forKey: "myKey") as? MyClass
    unarchiver.finishDecoding()
}

3. 检查类版本兼容性

确保编码和解码过程中使用的类版本一致。如果类定义发生变化,可能需要更新允许的类列表。

示例代码

以下是一个完整的示例,展示了如何正确使用NSKeyedUnarchiver并指定允许的类列表:

代码语言:txt
复制
import UIKit

class MyClass: NSObject, NSCoding {
    var name: String
    
    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as! String
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
    }
}

let allowedClasses: [AnyClass] = [MyClass.self]
if let data = Data(), let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data), unarchiver.allowedClasses = allowedClasses {
    let decodedObject = unarchiver.decodeObject(forKey: "myKey") as? MyClass
    unarchiver.finishDecoding()
    print(decodedObject?.name)
} catch {
    print("Error decoding object: \(error)")
}

参考链接

通过以上方法,你应该能够解决"[general] *-[forKey validateAllowedClass:NSKeyedUnarchiver:]允许取消存档..."错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券