我花了一个下午的时间把头撞在墙上,试图弄清楚为什么这门课的解码失败了。该类具有一个属性,它是Foo对象的NSArray。Foo符合NSSecureCoding,并且我已经成功地自己编码和解码了该类。我在initWithCoder中遇到了一个错误:上面说没有解码Foo类。通过一些实验,我发现我需要将Foo类添加到initWithCoder:以使其工作。也许这会帮助其他有同样问题的人。我的问题是,为何要这样做呢?我发现这在苹果的文档中是没有必要的。
#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发布于 2013-10-29 20:51:43
我想我可能已经搞清楚了。如果没有行Foo类,则此文件中没有对类Foo的引用。因此,我认为编译器正在优化Foo类,然后数组中的Foo对象无法解码。在那里有Foo类可以防止这种情况发生。
发布于 2014-10-30 18:26:15
对于那些仍在努力解决这个问题的人:本·H的解决方案并没有解决我的问题。我一直有以下错误消息:
由于“NSInvalidUnarchiveOperationException”异常终止应用程序,原因是:“键'NS.objects‘的值是意外类'ClassA’。允许的类是{( NSArray )}‘“。
最后,我意识到对于自定义类。您必须使用以下函数而不是decodeObjectOfClasses
- (id)decodeObjectOfClasses:(NSSet *)classes forKey:(NSString *)key并将NSSet中的所有可能的类传递给上面的函数!我不知道为什么@Ben H可以通过在函数之外添加一个[Foo class]来解决这个问题。也许这是一个编译器问题。但是无论如何,如果他的解决方案不起作用,那就试试这个。
发布于 2015-03-05 13:57:32
我刚刚遇到了类似的问题,这很奇怪,而且非常费时。我想用斯佩克塔/预期测试我的类是否正确地成为斯佩克塔/预期。因此,我实现了所有需要的东西,在解码时指定类。在我的审判结束时,我得到了最奇怪的例外:
value for key 'key' was of unexpected class 'MyClass'. Allowed classes are '{(
MyClass
)}'.测试看起来是这样的:
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测试仍然失败。经过广泛的试验,我找到了解决办法,只需一句:
[secureDecoder setClass:[MyClass class] forClassName:NSStringFromClass([MyClass class])];在我的所有测试都成功之后,就像预期的那样创建了对象。
我不知道为什么会发生这种情况,我猜类是不可见的,就像Ben H建议的那样,它使用类似于NSClassFromString(@"MyClass")的东西。上述代码在AppDelegate中运行良好。MyClass来自我正在开发的开发舱。
https://stackoverflow.com/questions/19579143
复制相似问题