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

谢谢!

【问题讨论】:

    标签: iphone objective-c xcode archive nskeyedarchiver


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

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 2011-07-14
        • 2014-10-27
        • 1970-01-01
        • 2012-12-28
        • 2012-02-10
        相关资源
        最近更新 更多