【发布时间】:2021-04-01 08:38:22
【问题描述】:
我有一个名为Person 的类并创建了一个Person instance“人”。
Person *person = [Person personWithName:@"Kyle", andAge:15];
然后我尝试使用方法archivedDataWithRootObject:requiringSecureCoding:error:对其进行编码。
NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:person
requiringSecureCoding:YES error:nil];
但是,personData 始终返回 nil。我错过了什么吗?
Person.h
@interface Person : NSObject<NSSecureCoding>
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
+ (instancetype)personWithName:(NSString *)name andAge:(NSInteger)age;
@end
Person.m
@implementation Person
+ (instancetype)personWithName:(NSString *)name andAge:(NSInteger)age{
Person *p = [Person new];
p.name = name;
p.age = age;
return p;
}
+ (BOOL)supportsSecureCoding {
return YES;
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder]; // error: No visible @interface for 'NSObject' declares the selector 'initWithCoder'
return self;
}
@end
更新(在 .m 中实现 +supportsSecureCoding 之后):
类“Person”有一个支持安全编码的超类,但是 'Person' 覆盖 -initWithCoder: 并且不覆盖 +支持安全编码。该类必须实现 +supportsSecureCoding 并返回 YES 以验证其 -initWithCoder: 的实现是否为 安全编码兼容。
【问题讨论】:
-
如果您使用
error参数而不是传递nil,它是否会提供有关失败原因的更多信息?另外,控制台中是否有错误消息?PersonNSCoding(和NSSecureCoding)是否符合要求? -
@Larme 它告诉我“这个解码器只会解码采用 NSSecureCoding 的类。类'Person'不采用它。”然后我implement +supportsSecureCoding in .m,但又得到一个错误(已在描述中更新)。
-
NSKeyedArchiver链接到NSCoding,否则,它不知道如何将该类转换为NSData并反转。现在,有了“安全的东西”,几乎是一样的。如错误消息中所述,您需要覆盖supportsSecureCoding以返回YES。这很明确。不?你是怎么写的?可以分享一下代码吗? -
@Larme 已发布代码。 TIA:)
-
你没有写
initWithCoder?
标签: objective-c nskeyedarchiver