返回

iOS NSKeyedUnarchiver解忧攻略:轻松应对归档和读取的挑战

Android

在 iOS 开发中解决“Class 'HSFileModel' does not adopt NSSecureCoding”错误

背景

iOS 开发者经常使用 NSKeyedUnarchiver 来存储和读取数据,以便在应用程序重新启动或更换设备后仍可访问这些数据。然而,在尝试读取已存档数据时,您可能会遇到以下错误:“Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'HSFileModel' does not adopt it."”。

错误含义

这个错误表明,解码器只能解码采用 NSSecureCoding 协议的类,而 HSFileModel 类没有采用这个协议。

NSSecureCoding 协议的重要性

NSSecureCoding 协议是一个安全编码协议,旨在确保在归档和读取数据时数据的安全性。通过采用这个协议,您可以防止恶意篡改或泄露数据。

采用 NSSecureCoding 协议

您可以通过在 HSFileModel 类中实现 NSCoding 协议来采用 NSSecureCoding 协议。NSCoding 协议是一个编码协议,提供用于归档和读取数据的函数。

实现 NSCoding 协议

HSFileModel 类中实现 NSCoding 协议涉及以下步骤:

  1. HSFileModel 类中声明 NSCoding 协议。
  2. 实现 NSCoding 协议中的 encode(with:) 函数。
  3. 实现 NSCoding 协议中的 init(coder:) 函数。

以下代码演示了如何实现 NSCoding 协议:

import Foundation

class HSFileModel: NSObject, NSCoding {
    var name: String
    var size: Int

    init(name: String, size: Int) {
        self.name = name
        self.size = size
    }

    required init?(coder aDecoder: NSCoder) {
        guard let name = aDecoder.decodeObject(forKey: "name") as? String,
              let size = aDecoder.decodeObject(forKey: "size") as? Int
        else {
            return nil
        }

        self.name = name
        self.size = size
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(size, forKey: "size")
    }
}

现在,您可以在 HSFileModel 类中使用 NSKeyedUnarchiver 来归档和读取数据。

结论

通过在 HSFileModel 类中实现 NSCoding 协议,您可以使其采用 NSSecureCoding 协议,从而解决“Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'HSFileModel' does not adopt it."”错误。希望这篇博文对您有所帮助。

常见问题解答

  1. 什么是 NSSecureCoding 协议?
    NSSecureCoding 协议是一个安全编码协议,旨在确保在归档和读取数据时数据的安全性。

  2. 为什么我的 HSFileModel 类没有采用 NSSecureCoding 协议?
    您需要在 HSFileModel 类中实现 NSCoding 协议才能使其采用 NSSecureCoding 协议。

  3. **如何解决“Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'HSFileModel' does not adopt it."”错误?**
    通过在 HSFileModel 类中实现 NSCoding 协议来解决此错误。

  4. 实现 NSCoding 协议的步骤是什么?
    在 HSFileModel 类中声明 NSCoding 协议,实现 encode(with:) 和 init(coder:) 函数。

  5. 实现 NSSecureCoding 协议有哪些好处?
    实现 NSSecureCoding 协议可以防止数据被恶意篡改或泄露。