从NSuserDefaults中取消归档数据的正确方法是什么?

时间:2012-02-07 05:56:27

标签: objective-c ios nsuserdefaults nsarchiving

我将一些基于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;
}

哪种方法正确?

这两者有什么区别?

2 个答案:

答案 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)。