[英]What is the correct way to unarchive something that was archived using encodeRootObject:?
[英]What is the correct way to unarchive data from NSuserDefaults?
我将一些基于Objective C的对象存储到NSuserdefaults中。
要从NSuserDefaults检索数据,我使用initWithCoder方法。
我已经看到了两种不同的实现:
实施1
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self != nil){
//decode properties, other class vars
self.variable = [decoder decodeObjectForKey:@"variable"];
}
return self;
}
实施2
- (id)initWithCoder:(NSCoder *)decoder {
self = [[CustomClass alloc] init];
if (self != nil){
//decode properties, other class vars
self.variable = [decoder decodeObjectForKey:@"variable"];
}
return self;
}
哪种方法正确?
两者有什么区别?
您不应该在方法中分配对象(分配发生在调用init / initWithCoder之前)。 您的代码应如下所示:
- (id)initWithCoder:(NSCoder *)decoder {
self = [super initWithCoder:decoder];
if (self != nil){
//decode properties, other class vars
self.variable = [decoder decodeObjectForKey:@"variable"];
}
return self;
}
这确实不是NSUserDefaults实现的区别,无论您的类是否是子类,都没有区别。 子类调用[super init]以获得其超类的属性(例如2),否则,您可以分配并初始化自定义类(例如1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.