首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过NSArray解码NSSecureCoding时的奇怪行为

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

Stack Overflow用户
提问于 2013-10-25 00:32:54
回答 4查看 3.1K关注 0票数 10

我花了一个下午的时间把头撞在墙上,试图弄清楚为什么这门课的解码失败了。该类具有一个属性,它是Foo对象的NSArray。Foo符合NSSecureCoding,并且我已经成功地自己编码和解码了该类。我在initWithCoder中遇到了一个错误:上面说没有解码Foo类。通过一些实验,我发现我需要将Foo类添加到initWithCoder:以使其工作。也许这会帮助其他有同样问题的人。我的问题是,为何要这样做呢?我发现这在苹果的文档中是没有必要的。

代码语言:javascript
复制
#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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-29 20:51:43

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

票数 2
EN

Stack Overflow用户

发布于 2014-10-30 18:26:15

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

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

最后,我意识到对于自定义类。您必须使用以下函数而不是decodeObjectOfClasses

代码语言:javascript
复制
- (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key

并将NSSet中的所有可能的类传递给上面的函数!我不知道为什么@Ben H可以通过在函数之外添加一个[Foo class]来解决这个问题。也许这是一个编译器问题。但是无论如何,如果他的解决方案不起作用,那就试试这个。

票数 12
EN

Stack Overflow用户

发布于 2015-03-05 13:57:32

我刚刚遇到了类似的问题,这很奇怪,而且非常费时。我想用斯佩克塔/预期测试我的类是否正确地成为斯佩克塔/预期。因此,我实现了所有需要的东西,在解码时指定类。在我的审判结束时,我得到了最奇怪的例外:

代码语言:javascript
复制
value for key 'key' was of unexpected class 'MyClass'. Allowed classes are '{(
    MyClass
)}'.

测试看起来是这样的:

代码语言:javascript
复制
MyClass *myClassInstance = ...
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *secureEncoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[secureEncoder setRequiresSecureCoding:YES]; // just to ensure things

NSString *key = @"key";
[secureEncoder encodeObject:myClassInstance forKey:key];
[secureEncoder finishEncoding];

NSKeyedUnarchiver *secureDecoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[secureDecoder setRequiresSecureCoding:YES];
MyClass *decodedInstance = [secureDecoder decodeObjectOfClass:[MyClass class] forKey:key]; // exception here
[secureDecoder finishDecoding];

...expect...

虽然普通NSCoding (requiresSecureCoding = NO)测试成功,但NSSecureCoding测试仍然失败。经过广泛的试验,我找到了解决办法,只需一句:

代码语言:javascript
复制
[secureDecoder setClass:[MyClass class] forClassName:NSStringFromClass([MyClass class])];

在我的所有测试都成功之后,就像预期的那样创建了对象。

我不知道为什么会发生这种情况,我猜类是不可见的,就像Ben H建议的那样,它使用类似于NSClassFromString(@"MyClass")的东西。上述代码在AppDelegate中运行良好。MyClass来自我正在开发的开发舱。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19579143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档