首页 > 解决方案 > 使用 decodeObject(of: forKey:) 解码符合协议的对象

问题描述

我有一个需要遵守的 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?

标签: iosswiftprotocolsnssecurecoding

解决方案


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

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

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


推荐阅读