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 中类的递归归档的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 语言编写递归函数以遍历 Objective C 中的 Collection 对象
归档发布时,通过桥接头暴露的 Objective-c 类在 swift 中不可见