Objective c 解决`+;[NSKeyedUnarchiver unarchiveTopLevelObjectWithData:error:`弃用导致';无法获取数据’;不可阅读';错误

Objective c 解决`+;[NSKeyedUnarchiver unarchiveTopLevelObjectWithData:error:`弃用导致';无法获取数据’;不可阅读';错误,objective-c,nscoding,Objective C,Nscoding,我有这个代码,它可以工作: Foo *foo = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:data error:&error]; 然而,它给了我一个警告: “unarchiveTopLevelObjectWithData:error:”已弃用:在iOS 12.0中首次弃用-改用+UnarchiveObjectOfClass:fromData:error: 当我尝试用以下方法进行简单替换时: Foo *foo = [NSKey

我有这个代码,它可以工作:

Foo *foo = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:data error:&error];
然而,它给了我一个警告:

“unarchiveTopLevelObjectWithData:error:”已弃用:在iOS 12.0中首次弃用-改用+UnarchiveObjectOfClass:fromData:error:

当我尝试用以下方法进行简单替换时:

Foo *foo = [NSKeyedUnarchiver unarchivedObjectOfClass:[Foo class] fromData:data error:&error];
。。。它失败,出现以下错误:

无法读取数据,因为它的格式不正确


如何用未弃用的方法正确替换此弃用的方法?

这可能是因为您的对象符合
NSCoding
,但它应该符合
NSSecureCoding

如果查看for unarchivedObjectOfClass:fromData:error:,您会注意到它说:

重要
确保在解码的类型中采用了NSSecureCodeding。如果对解码前缀方法的任何调用失败,默认的decodingFailurePolicy将设置错误,而不是引发异常。在这种情况下,当前和所有后续解码调用返回0或nil

因此,您需要执行以下操作才能切换到未弃用的函数:

  • 正如弃用警告所说,将函数从
    [NSKeyedUnarchiver unarchivedoplevelobjectwithdata:data error:&error]
    切换到
    [NSKeyedUnarchiver unarchivedObjectOfClass:[Foo class]fromData:data error:&error]
  • 支持安全编码:

  • 将顶级对象的一致性从
    NSCoding
    切换到
    NSSecureCoding
  • 添加属性:

    @property (class, readonly) BOOL supportsSecureCoding;
    
  • 实施该方法:

    + (BOOL)supportsSecureCoding {
        return YES;
    }
    
  • 如果您的对象具有任何其他正在进行
    NSCoding
    的属性,请对其重复所有这些步骤,以便它们最终符合
    NSSecureCoding
    。例如,如果有一个属性
    @property(非原子,强)条*Bar
    在正在编码的
    Foo
    对象上,您需要确保
    Bar
    也符合
    NSSecureCoding
    ,而不仅仅是
    NSCoding

  • (可选)更改编码调用以要求安全编码(即第二个参数可以是
    YES
    ):

  • 似乎苹果希望人们从
    NSCoding
    切换到
    NSSecureCoding
    ,如果
    NSCoding
    也被弃用,上述问题将更容易解决

    [NSKeyedArchiver archivedDataWithRootObject:self requiringSecureCoding:YES error:&error];