在网络调用返回的NSJSONSerialization上使用NSData,我得到NSDictionaries和NSArrays的嵌套结构。
现在,我想解析这个树结构,并准备它以供进一步使用。树的每个节点总是带有一个子节点的NSArray (NSDictionaries)。这些节点中的每一个都应该有一个对其父节点的反向引用,其中包含子节点所属的NSArray。
这是我所说的结构的一个基本例子:
Node {
nodes:[
node {parent:Node,name:foo},
node {parent:Node,name:bar},
node {parent:Node,name:baz},
]
,name:root}每个节点是一个NSDictionary,每个子节点收集一个包含NSDictionaries的NSArray。
我了解到,我不能仅仅添加一个新的键“父”,并将其值设置为父节点字典。它在调用对象时创建一个分段错误。
代码的基本示例,创建父键:
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为什么我会有分割错误?由于节点的父键中有反向引用,这是一个无限循环吗?
你们还有别的办法来解决这个问题吗?我是否必须持有树结构的外部代表,指向每个键,还是实际上有一种方式存储对父节点的某种引用?
多,多谢谢!
发布于 2011-12-30 16:54:21
在我看来,您可以在这里使用一个简单的objective类,其接口如下
@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
发布于 2011-12-30 16:50:43
NSLog线上的分段故障是由于无限循环造成的。您可以通过子类NSMutableDictionary和重写-description来具体排除打印键“父”的值来打破这种情况。不过,更普遍的是,NSMutableDictionary并不是为了包含自己的容器而设计的。首先,NSDictionary保留其子对象,因此容器保留foo,foo保留容器,这将创建一个保留循环。
我的方法是编写您自己的模型类。您可以使用NSMutableDictionary对象存储子节点,弱@property/ivar保存对父节点的引用。
https://stackoverflow.com/questions/8681684
复制相似问题