ios - 使用解码对象(: forKey:) to decode an object that conforms to a protocol

标签 ios swift protocols nssecurecoding

我有一个 Objective-C 协议(protocol),需要符合 NSSecureCoding:

@protocol MyProtocol <NSObject, NSSecureCoding>
…
@end

我有一个父对象,它存储对符合 MyProtocol 的对象的引用,我希望父对象也符合 NSSecureCoding。当我尝试这个时:

required init?(coder aDecoder: NSCoder) {

    if let childObject = aDecoder.decodeObject(of: MyProtocol.self, forKey: "childObject") {
        self. childObject = childObject
    } else {
        return nil
    }
}

我收到错误:'decodeObject(of:forKey:)' 在 Swift 中不可用:使用通用的 'decodeObjectOfClass(_:forKey:)'

如果你不知道你编码的对象的具体类,有什么方法可以使用 NSSecureCoding 吗?

最佳答案

NSSecureCoding 的全部意义在于防止这种用例。如果您不知道正在解码的类,那么攻击者可以诱使您解码为一个行为不同于您对给定方法所期望的类的类(称为“替换攻击”)。这是一种用于攻击系统的技术,开发了 NSSecureCoding 来阻止它。

即使不是这种情况,也不可能构造协议(protocol)类型的对象。运行时无法知道为实例变量分配多少内存。

为了符合NSSecureCoding,您必须知道所有子对象的准确类。

关于ios - 使用解码对象(: forKey:) to decode an object that conforms to a protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50750655/

相关文章:

json - 如何在 Swift 中解析 JSON?

使用 `pow` 的 Swift 2 协议(protocol)扩展

ios - 调用swift后委托(delegate)不执行

objective-c - 如何在特定点停止 UIScrollView?

iphone - tableView reloadData 不工作

javascript - UIWebView 中的错误 CSS 行为 : font-size is misinterpreted

macos - 适用于 iOS 和 Mac 项目的构建工具

ios - tableview 内的 UITextView 不根据内容调整大小

ios - 如何填写2个不同的单元格?

ios - 如何使用 if 语句将一种类型的变量设置为特定类型的自定义 tableCell?