0

我有两个以准系统形式看起来像这样的类:

@interface GraphNode {
    NSMutableArray *edges;
}

@implementation GraphNode

-(id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        edges = [coder decodeObjectForKey:@"edges"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:edges forKey:@"edges"];
}

@end

@interface GraphEdges {
  NSMutableArray *edges;
}

@implementation GraphEdges

-(id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        edges = [coder decodeObjectForKey:@"edges"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:edges forKey:@"edges"];
}

@end

您会注意到它们似乎表达了相同的行为 - 编码/解码 NSMutableArray,其内容是实现 NSCoding 的 GraphEdge 类型的对象。实践中类之间的区别在于 GraphEdges 在其edges属性中创建边,而 GraphNode 添加到它自己edges对 GraphEdges.edges 中已经存在的 GraphEdge 实例的唯一引用。

edges我的问题是,在解码 GraphNode 和 GraphEdges 对象时,不会维护对象图,因为每个类都会为每个类创建存储在属性中的原始 GraphEdge 对象的自己的版本。

我尝试对 GraphNode 中的整个 NSMutableArray *edges 执行 encodeConditionalObject,同时保持 GraphEdges 中的编码无条件,但不出所料,这根本无法对 GraphNode.edges 进行编码,因为条件放置在数组本身上,而不是它的对象上。

解决方案是在这两种情况下遍历数组,并对 GraphNode 的每个成员执行条件编码,edges但对 GraphEdges 的每个成员执行无条件编码edges

任何建议表示赞赏,非常感谢。

4

1 回答 1

1

我认为这里的问题是您要分别归档 GraphNode 和 GraphEdges 对象。将所有相关的 GraphNode 和 GraphEdges 对象组合在某种容器中,可能是“Graph”,以便它们都成为同一个对象图的一部分。我相信 NSKeyedArchiver 然后只会将每个对象归档一次。

于 2011-03-14T16:31:04.870 回答