Objective C 中类的递归归档

Posted

技术标签:

【中文标题】Objective C 中类的递归归档【英文标题】:Recursive archiving of classes in Objective 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 类型的变量。 是否可以递归归档自定义对象?如果有,怎么做?

谢谢!

【问题讨论】:

【参考方案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,而不是单个对象。这样,您就可以安全地拥有递归对象。

【讨论】:

以上是关于Objective C 中类的递归归档的主要内容,如果未能解决你的问题,请参考以下文章