【问题标题】:Error of Unexpected class while encode/decode an NSArray with NSSecureCoding使用 NSSecureCoding 对 NSArray 进行编码/解码时出现意外类错误
【发布时间】:2014-10-30 16:23:57
【问题描述】:

背景

我们有多个符合NSSecureCoding 协议的类。

@interface ClassA : NSObject <NSSecureCoding>
// ...
@end

@interface ClassB : NSObject <NSSecureCoding>
// ...
@end

我们注意到NSArray 也符合NSSecureCoding。因此,我们尝试以下方法。

对于编码:

NSArray* array = ...
[archiver encodeObject:array forKey:@"AirdropDataKey"];

用于解码

NSArray* array = [unarchiver decodeObjectOfClass:[NSArray class] 
                                          forKey:@"AirdropDataKey"];

我收到以下错误消息。

由于未捕获的异常“NSInvalidUnarchiveOperationException”而终止应用程序,原因:“键“NS.objects”的值属于意外类“ClassA”。允许的类是 '{(
NSArray
)}'.'

谁能解释为什么以及是否有可能解决这个问题?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    NSCoder 提供了一个额外的方法decodeObjectOfClasses:forKey:,其中可以传递一组预期的对象。这允许解码嵌套结构。

    只需传递一组 NSArray 和你的 ClassAClassB 类:

    NSSet *classes = [NSSet setWithObjects:[NSArray class], [ClassA class] ,[ClassB class], nil];
    NSArray* array = [unarchiver decodeObjectOfClasses:classes forKey:@"AirdropDataKey"];
    

    【讨论】:

      【解决方案2】:

      对于method下方的解码使用并检查:-

       - (id)decodeObjectForKey:(NSString *)key
      

      【讨论】:

      • 为什么我们不能使用NSSecureCoding而必须使用NSCoding
      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多