首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套NSDictionary结构-如何保存对树中每个节点的父节点的引用

嵌套NSDictionary结构-如何保存对树中每个节点的父节点的引用
EN

Stack Overflow用户
提问于 2011-12-30 16:34:29
回答 2查看 2.5K关注 0票数 0

在网络调用返回的NSJSONSerialization上使用NSData,我得到NSDictionaries和NSArrays的嵌套结构。

现在,我想解析这个树结构,并准备它以供进一步使用。树的每个节点总是带有一个子节点的NSArray (NSDictionaries)。这些节点中的每一个都应该有一个对其父节点的反向引用,其中包含子节点所属的NSArray。

这是我所说的结构的一个基本例子:

代码语言:javascript
运行
复制
Node {
 nodes:[
  node {parent:Node,name:foo},
  node {parent:Node,name:bar},
  node {parent:Node,name:baz},
 ]
,name:root}

每个节点是一个NSDictionary,每个子节点收集一个包含NSDictionaries的NSArray。

我了解到,我不能仅仅添加一个新的键“父”,并将其值设置为父节点字典。它在调用对象时创建一个分段错误。

代码的基本示例,创建父键:

代码语言:javascript
运行
复制
NSMutableDictionary * foo = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"foo",@"name",[NSNumber numberWithInt:1],@"value",nil];
NSMutableDictionary * bar = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"bar",@"name",[NSNumber numberWithInt:2],@"value",nil];
NSMutableDictionary * baz = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"baz",@"name",[NSNumber numberWithInt:3],@"value",nil];

NSMutableArray *array = [NSMutableArray arrayWithObjects:foo,bar,baz,nil];

NSMutableDictionary * container = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"root",@"name",array,@"nodes",nil];

[foo setValue:container forKey:@"parent"];

NSLog(@"%@",foo);  // <-- segfault here

为什么我会有分割错误?由于节点的父键中有反向引用,这是一个无限循环吗?

你们还有别的办法来解决这个问题吗?我是否必须持有树结构的外部代表,指向每个键,还是实际上有一种方式存储对父节点的某种引用?

多,多谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-30 16:54:21

在我看来,您可以在这里使用一个简单的objective类,其接口如下

代码语言:javascript
运行
复制
@interface Node : NSObject {
    Node              *parent;
    NSMutableArray    *nodes;
    NSString          *name
}
@end

我不确定这是否是最好的方法,但您不应该使用NSDictionary。您获得分段错误的原因可能是因为反向引用在NSLog中创建了一个无限循环。

编辑:在googling上,我发现有一个类NSTreeNode可以使事情变得更简单。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSTreeNode_class/Introduction/Introduction.html

票数 1
EN

Stack Overflow用户

发布于 2011-12-30 16:50:43

NSLog线上的分段故障是由于无限循环造成的。您可以通过子类NSMutableDictionary和重写-description来具体排除打印键“父”的值来打破这种情况。不过,更普遍的是,NSMutableDictionary并不是为了包含自己的容器而设计的。首先,NSDictionary保留其子对象,因此容器保留foo,foo保留容器,这将创建一个保留循环。

我的方法是编写您自己的模型类。您可以使用NSMutableDictionary对象存储子节点,弱@property/ivar保存对父节点的引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8681684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档