错误"[general] *-[forKey validateAllowedClass:NSKeyedUnarchiver:]允许取消存档..."通常发生在iOS开发中,当你尝试使用NSKeyedUnarchiver
解码(unarchive)一个对象时,如果该对象的类不在允许的类列表中,就会出现这个错误。
NSKeyedUnarchiver
是iOS中的一个类,用于从二进制数据中解码对象。它通常用于解码之前使用NSKeyedArchiver
编码的对象。为了安全起见,NSKeyedUnarchiver
允许开发者指定一组允许解码的类,以防止恶意代码执行。
这个错误通常是由于以下原因之一引起的:
以下是一些解决这个问题的常见方法:
确保所有需要解码的类都已经定义,并且在项目中正确导入。例如:
import UIKit
在解码时,明确指定允许的类列表。例如:
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()
}
确保编码和解码过程中使用的类版本一致。如果类定义发生变化,可能需要更新允许的类列表。
以下是一个完整的示例,展示了如何正确使用NSKeyedUnarchiver
并指定允许的类列表:
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:]允许取消存档..."错误。
领取专属 10元无门槛券
手把手带您无忧上云