通过NSSecureCoding解码NSArray时的奇怪行为

Ben*_*n H 7 objective-c nscoding nsarray ios nssecurecoding

我花了整个下午的时间撞到墙上,试图弄清楚为什么这门课的解码失败了.该类有一个属性,它是Foo对象的NSArray.Foo符合NSSecureCoding,我已成功编码并解码了该类.我在initWithCoder中收到错误:表示无法解码类Foo.通过一些实验,我发现我需要将[Foo类]添加到initWithCoder:为了使它工作.也许这会帮助那些遇到同样问题的人.我的问题是,为什么这是必要的?我没有发现在Apple的文档中这是必要的.

#import "Foo.h"

@interface MyClass : NSObject <NSSecureCoding>
@property (nonatomic) NSArray *bunchOfFoos;
@end

@implementation MyClass

static NSString *kKeyFoo = @"kKeyFoo";

+ (BOOL) supportsSecureCoding
{
    return YES;
}

- (void) encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:self.bunchOfFoos forKey:kKeyFoo];
}

- (id) initWithCoder:(NSCoder *)decoder
{
    if (self = [super init])
    {
        [Foo class]; // Without this, decoding fails
        _bunchOfFoos = [decoder decodeObjectOfClass:[NSArray class] forKey:kKeyFoo];
    }
    return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

Yuc*_*ong 5

对于那些仍在努力解决这个问题的人:@Ben H的解决方案并没有解决我的问题.我一直有以下错误消息:

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

最后,我意识到自定义类.您必须使用以下功能decodeObjectOfClasses:

- (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key
Run Code Online (Sandbox Code Playgroud)

并且您将NSSet所有可能的类传递给NSArray上面的函数!我不确定为什么@Ben H可以通过简单地添加[Foo class]函数外部来解决问题.也许这是编译器问题.但无论如何,如果他的解决方案不起作用,也可以尝试这个.


Ben*_*n H 2

我想我可能已经弄清楚了。如果没有 [Foo class] 行,则此文件中没有对 Foo 类的引用。因此,我相信编译器正在优化 Foo 类,然后数组中的 Foo 对象无法解码。那里有 [Foo class] 可以防止这种情况发生。