使用decodeObject(of:forKey :)来解码符合协议的对象

时间:2018-06-07 21:52:43

标签: ios swift protocols nssecurecoding

我有一个Objective-C协议,要求符合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:)' is unavailable in Swift: use generic 'decodeObjectOfClass(_:forKey:)'

如果您不知道您编码的对象的特定类,有没有办法使用NSSecureCoding?

1 个答案:

答案 0 :(得分:5)

NSSecureCoding的全部内容是为了防止此用例。如果你不知道你正在解码的类,那么攻击者可以诱骗你解码成一个行为与你给定方法所期望的行为不同的类(称为&#34;替换攻击&#34;)。这是一种用于攻击系统的技术,NSSecureCoding是为了阻止它而开发的。

即使情况并非如此,也无法构建协议类型的对象。运行时无法知道为实例变量分配多少内存。

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