【问题标题】:How to initialize this archived object?如何初始化这个归档对象?
【发布时间】:2009-11-04 14:34:09
【问题描述】:

我已经创建了一个符合协议的类。所以我实现了一个这样的init方法:

- (id)initWithCoder:(NSCoder*)decoder {
 if ((self = [super init])) {
  self.someIvarObject = [decoder decodeObjectForKey:kObjectKey];
 }
 return self;
}

当然我也实现了-(void)encodeWithCoder:(NSCoder*)encoder 方法。

我现在还没有想好如何归档这个对象。我是否必须创建我的对象的实例,然后只需调用 -initWithCoder: 并提供适当的 NSCoder 对象?

我问的原因是我需要知道是否可以在这个初始化方法中添加另一个参数。当我自己调用它时,我想应该没问题。虽然我必须使用正确的协议签名来实现-(void)encodeWithCoder:(NSCoder*)encoder

也许有人可以提供一个小例子来快速显示对象是如何取消归档的?那太好了!

编辑:这是我尝试做的更详细的示例。还不知道这是否适用于这样的可归档对象...

- (id)initWithCoder:(NSCoder*)decoder somethingSpecial:(Special*)special {
 if ((self = [super init])) {
  self.someIvarObject = [decoder decodeObjectForKey:kObjectKey];
  self.somethingSpecial = special;
 }
 return self;
}

- (id)initWithCoder:(NSCoder*)decoder {
 return [self initWithCoder:decoder decimalCalculator:nil];
}

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    要对您的对象进行编码,请调用:

    NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:myObject];
    

    解码:

    MyObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData:archive];
    

    【讨论】:

    • 在您发布的解码部分,变量存档将是一个 NSData 对象,对吧?
    • 所以这意味着我从不手动调用-initWithCoder,这也意味着我不能像上面那样为我的类提供参数,对吧?
    • 是的,没错。如果你想将你的归档文件直接写入文件并直接从文件中读取,还有+[NSKeyedArchiver archiveRootObject:toFile:]+[NSKeyedUnarchiver unarchiveObjectWithFile:]
    • 是的,您从不直接致电-initWithCoder:。您必须在取消归档后设置参数。
    【解决方案2】:

    你可以看看NSArchiver类。

    它是NSCoder 的一个子类,可以从NSData 对象归档和取消归档。

    然后您可以将NSData 存储在文件中,或任何其他位置以重新创建对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多