ios - 使用 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?
解决方案
的全部目的NSSecureCoding
是防止这种用例。如果您不知道要解码的类,那么攻击者可以诱使您解码为与给定方法所期望的行为不同的类(称为“替换攻击”)。这是一种用于攻击系统的技术,并且NSSecureCoding
是为了阻止它而开发的。
即使不是这样,也不可能构造协议类型的对象。运行时将无法知道为实例变量分配多少内存。
为了符合NSSecureCoding
,您必须知道所有子对象的精确类。
推荐阅读
- javascript - 基于登录用户的 ObjectID 从 Mongo 获取数据
- reactjs - 没有重载与简单反应应用程序上的此调用匹配
- python - 我如何应用逻辑回归算法来使用卫星数据绘制决策边界
- javascript - 作用域链和闭包的区别
- sql-server - SQL Server ODBC“TCP 提供程序:错误代码 0x274C”
- sql-server - 加入 charindex 很慢
- vba - Recordset.AddNew 上带有预定义数组的错误 3001
- react-native - 我的登录屏幕中的错误“找不到变量”
- colors - 色轮的圆形饱和亮度渐变
- json - jq - 过滤不包含的实例不起作用