【问题标题】:What is the correct way to unarchive data from NSuserDefaults?从 NSuserDefaults 取消归档数据的正确方法是什么?
【发布时间】:2012-02-07 05:56:26
【问题描述】:

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

哪种方法是正确的?

这两者有什么区别?

【问题讨论】:

    标签: objective-c ios nsuserdefaults nsarchiving


    【解决方案1】:

    您不应该在方法中分配对象(分配发生在调用 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;
    }
    

    【讨论】:

    • initWithCoder 是 NSCoding 协议的成员。 NSObject 没有实现 NSCoding(你必须为你自己的类显式声明它),所以你不能从直接从 NSObject 派生的类调用 [super initWithCoder:decorder]。
    【解决方案2】:

    这真的不是 NSUserDefaults 实现的区别,你的类是否是子类的区别。子类调用 [super init] 来获取其超类的属性(例如 2),否则您可以分配并初始化自定义类(例如 1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多