【问题标题】:Recursive archiving of classes in Objective CObjective C 中类的递归归档
【发布时间】:2012-03-22 17:05:42
【问题描述】:
假设我定义了一个 ClassA ,它实现了 NSCoding 协议(这个类包含几个变量,例如 NSString、NSArray 等)。
我还创建了一个 ClassB,其中有一个 ClassA 类型的变量。
像这样的:
@interface ClassB: NSObject <NSCoding>
{
NSString *str;
NSDate *date;
int x;
ClassA *sc;
}
在我的程序中,我想归档一个 ClassB 类型的变量。
是否可以递归归档自定义对象?如果有,怎么做?
谢谢!
【问题讨论】:
标签:
iphone
objective-c
xcode
archive
nskeyedarchiver
【解决方案1】:
你需要为你的 ClassB 实现 NSCoding 接口:
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super initWithCoder:decoder];
if (self)
{
str = [[decoder decodeObjectForKey:@"MyStr"] retain];
date = [[decoder decodeObjectForKey:@"MyDate"] retain];
x = [decoder decodeIntegerForKey:@"MyX"];
sc = [decoder decodeObjectForKey:@"MyClassA"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
[super encodeWithCoder:encoder];
[encoder encodeObject:str forKey:@"MyStr"];
[encoder encodeObject:date forKey:@"MyDate"];
[encoder encodeInteger:x forKey:@"MyX"];
[encoder encodeObject:sc forKey:@"MyClassA"];
}
ClassA 也必须实现 NSCoding 协议。
【解决方案2】:
与 Java 中的序列化工作方式类似,通过 NSCoder 归档的工作方式与 ObjC 中的工作方式相同。基本上,每个对象都使用“id”进行编码,并且作为另一个对象成员的每个对象都被编码为该 ID,而不是单个对象。这样,您就可以安全地拥有递归对象。