XCode/iOS:NSCoding - 具有两个公共对象数组的对象图的持久性

Posted

技术标签:

【中文标题】XCode/iOS:NSCoding - 具有两个公共对象数组的对象图的持久性【英文标题】:XCode/iOS: NSCoding - persistence of object graph with two arrays of common objects 【发布时间】:2011-03-14 16:04:29 【问题描述】:

我有两个类似这样的准系统类:

@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 实例的引用。

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

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

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

感谢任何建议,非常感谢。

【问题讨论】:

这和 Xcode 有什么关系? 【参考方案1】:

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

【讨论】:

你说得对,我给了他们一个共同的祖先,实现了 NSCoding,问题就解决了。非常感谢,迦勒。

以上是关于XCode/iOS:NSCoding - 具有两个公共对象数组的对象图的持久性的主要内容,如果未能解决你的问题,请参考以下文章

没有具有有效签名身份的配置文件。没有找到匹配的配置文件,xcode,ios

xcode / iOS:UITextField覆盖到具有相同框架的UITableViewCell上不匹配

IAP 的 NSCoding 或 Userdefaults

如何使用 NSCoding 保存结构

使用 Xcode 7、iOS 9 运行项目时出现“应用程序窗口应在应用程序启动结束时具有根视图控制器”错误

NSCopying和NSCoding对象序列化反序列化基础详解