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)
对于那些仍在努力解决这个问题的人:@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]函数外部来解决问题.也许这是编译器问题.但无论如何,如果他的解决方案不起作用,也可以尝试这个.
我想我可能已经弄清楚了。如果没有 [Foo class] 行,则此文件中没有对 Foo 类的引用。因此,我相信编译器正在优化 Foo 类,然后数组中的 Foo 对象无法解码。那里有 [Foo class] 可以防止这种情况发生。
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |