在Objective C中递归归档类

时间:2012-03-22 17:05:42

标签: iphone objective-c xcode archive nskeyedarchiver

假设我定义了一个实现NSCoding协议的ClassA(该类包含几个变量,如NSString,NSArray等)。 我还创建了一个ClassB,它有一个ClassA类型的变量。 像这样:

 @interface ClassB: NSObject <NSCoding>
 {
     NSString *str;
     NSDate *date;
     int x;
     ClassA *sc;
 } 

在我的程序中,我想归档一个ClassB类型的变量。 是否可以递归归档自定义对象?如果是这样,怎么样?

谢谢!

2 个答案:

答案 0 :(得分:1)

类似于Java中序列化的工作原理,通过NSCoder存档在ObjC中的工作方式相同。基本上,每个对象都使用'id'编码,并且作为另一个对象成员的每个对象都被编码为该ID,而不是单个对象。这样,你可以安全地拥有递归对象。

答案 1 :(得分: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协议。