使用 decodeObject(of: forKey:) 解码符合协议的对象
Using decodeObject(of: forKey:) to decode an object that conforms to a protocol
我有一个 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:)'
。
如果您不知道所编码对象的具体 class,有什么方法可以使用 NSSecureCoding?
NSSecureCoding
的全部意义在于防止这种用例。如果您不知道正在解码的 class,那么攻击者可以诱使您解码为一个 class,它的行为与您对给定方法的预期不同(称为 "substitution attack" ).这是一种用于攻击系统的技术,NSSecureCoding
是为了阻止它而开发的。
即使不是这种情况,也不可能构造协议类型的对象。运行时无法知道为实例变量分配多少内存。
为了符合 NSSecureCoding
,您必须知道所有子对象的精确 classes。
我有一个 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:)'
。
如果您不知道所编码对象的具体 class,有什么方法可以使用 NSSecureCoding?
NSSecureCoding
的全部意义在于防止这种用例。如果您不知道正在解码的 class,那么攻击者可以诱使您解码为一个 class,它的行为与您对给定方法的预期不同(称为 "substitution attack" ).这是一种用于攻击系统的技术,NSSecureCoding
是为了阻止它而开发的。
即使不是这种情况,也不可能构造协议类型的对象。运行时无法知道为实例变量分配多少内存。
为了符合 NSSecureCoding
,您必须知道所有子对象的精确 classes。