2012-02-07 27 views
0

我正在将一些基于Objective C的对象存储到NSuserdefaults中。从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

这实际上在NSUserDefaults实现方面没有什么区别,不同的是你的类是否是子类。子类调用[super init]来获得它们超类的属性(例2),否则你可以只分配和初始化自定义类(例如1)。

1

你不应该在方法中分配你的对象(在调用init/initWithCoder之前发生alloc)。您的代码应如下所示:

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super initWithCoder:decoder]; 
    if (self != nil){ 
     //decode properties, other class vars 
     self.variable = [decoder decodeObjectForKey:@"variable"]; 
    } 
    return self; 
} 
+0

initWithCoder是NSCoding协议的成员。 NSObject没有实现NSCoding(你必须为你自己的类明确声明它),所以你不能从直接派生自NSObject的类调用[super initWithCoder:decorder]。 – interrupt 2013-09-30 03:16:52

相关问题