Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标C中类的递归归档_Iphone_Objective C_Xcode_Archive_Nskeyedarchiver - Fatal编程技术网

Iphone 目标C中类的递归归档

Iphone 目标C中类的递归归档,iphone,objective-c,xcode,archive,nskeyedarchiver,Iphone,Objective C,Xcode,Archive,Nskeyedarchiver,假设我定义了一个ClassA,它实现了NSCoding协议(这个类包含几个变量,比如NSString、NSArray等)。 我还创建了一个ClassB,其中有一个ClassA类型的变量。 大概是这样的: @interface ClassB: NSObject <NSCoding> { NSString *str; NSDate *date; int x; ClassA *sc; } @接口类B:NSObject { NSString*

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

 @interface ClassB: NSObject <NSCoding>
 {
     NSString *str;
     NSDate *date;
     int x;
     ClassA *sc;
 } 
@接口类B:NSObject
{
NSString*str;
NSDate*日期;
int x;
甲级*sc;
} 
在我的程序中,我想归档ClassB类型的变量。 是否可以递归存档自定义对象?如果是,怎么做


谢谢

与Java中序列化的工作方式类似,通过NSCoder进行归档在ObjC中的工作方式相同。基本上,每个对象都用一个“id”编码,而作为另一个对象成员的每个对象都被编码为该id,而不是单个对象。这样,您就可以安全地拥有递归对象。

您需要为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协议