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 中类的递归归档的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C学习1

使用 Swift 语言编写递归函数以遍历 Objective C 中的 Collection 对象

归档发布时,通过桥接头暴露的 Objective-c 类在 swift 中不可见

如何将自定义对象的 NSArray 归档到 Objective-C 中的文件

Objective c类的初始化

在objective-c中归档对象内的对象