我将一些基于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;
}
哪种方法正确?
这两者有什么区别?
答案 0 :(得分:1)
你不应该在方法中分配你的对象(alloc在调用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;
}
答案 1 :(得分:0)
这在NSUserDefaults实现中确实没有区别,不管您的类是否是子类。子类调用[super init]来获取超类的属性(例如2),否则你可以只分配和初始化自定义类(例如1)。