2009-11-04 53 views
0

我做了一个符合协议的类。所以,我已经实现了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]; 
} 

回答

0

要编码您的对象,调用:

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:myObject]; 

对其进行解码:

MyObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData:archive]; 
+0

在您发布的解码部分,变量归档将是一个NSData对象吗? – 2009-11-04 15:48:00

+0

所以这意味着我从来不会手动调用-initWithCoder,这也意味着我无法像上面那样为我的类提供参数,对吗? – 2009-11-04 15:49:00

+0

是的,这是正确的。如果你想直接将文件写入文件并直接从文件中读取,还有'+ [NSKeyedArchiver archiveRootObject:toFile:]'和'+ [NSKeyedUnarchiver unarchiveObjectWithFile:]'。 – 2009-11-04 15:50:11

0

你可以看看NSArchiver类。

它是NSCoder的一个子类,它将归档并从NSData对象中取消归档。

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