我决定使用NSSecureCoding
而不是NSCoding
,但我无法使其工作。使用NSSecureCoding强制类型
我期望以下代码失败,因为我编码NSString
但试图解码NSNumber
。然而,该对象被初始化而没有抛出异常。
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
// prints '1' as expected
NSLog(@"%d", coder.requiresSecureCoding);
// unexpectedly prints 'foo' (expecting crash)
NSLog(@"%@", [coder decodeObjectOfClass:NSNumber.class forKey:@"bar"]);
return [super init];
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:@"foo" forKey:@"bar"];
}
下面是我用从上面测试片断代码:
MyClass *object = [[MyClass alloc] init];
NSMutableData *const data = [[NSMutableData alloc] init];
NSKeyedArchiver *const archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
archiver.requiresSecureCoding = YES;
[archiver encodeObject:object forKey:@"root"];
[archiver finishEncoding];
NSKeyedUnarchiver *const unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.requiresSecureCoding = YES;
[unarchiver decodeObjectOfClass:MyClass.class forKey:@"root"];
[unarchiver finishDecoding];
我失去的东西完全明显,或者为什么解码期间抛出也不例外?
您的NSLogs是否实际打印出值? – Chase 2015-03-24 22:40:29
是的,他们打印上面的评论。 – 2015-03-25 01:50:33
如果您调用'[super initWithCoder:]'而不是'[super init]',问题是否会持续存在? – 2015-03-26 22:29:43