2011-08-28 35 views
1

想象一下,你有一个递归对象的结构是这样的:在Objective-C中以这种方式遍历对象图吗?

MyComposite *c = [MyComposite compositeWithName:@"Jack"]; 

// add/append some children ...  

do 
{ 
    // do something with the current composite 
    ... 
    // continue traversal 
    c = [c child]; 
}while (c); 

这是遍历在内存管理方面是否有效?

+1

取决于孩子对象的分配类型,如果父母被适当的保留和释放(@动态或@property ...) –

+0

父母是一个弱属性(非原子,分配),孩子是一个属性(非原子,保留) –

+0

我只是想知道,如果该图被分配c.child打扰c –

回答

2

是的,没关系。 c是指向MyComposite实例的局部变量。将另一个MyComposite指针值重新分配给c对原始MyComposite实例没有任何影响。

关于Yuji的回答,你不应该使用NSArray或NSSet来存储递归数据结构,你的数据结构是好的。 NSArray和NSSet是为平面数据集设计的,除了在NSArray的情况下强制执行线性排序之外,不能指定其成员之间的任何关系。

+0

感谢您的澄清 –

3

从理论上讲,没有什么错。但是:

  1. 通常在Objective-C,你只需要使用NSArrayNSSet,你不写自己的链表类。请注意0​​不是标准意义上的数组。例如,在中间插入对象并不是很慢。
  2. 由于WTP表示,您不会指定获取者get...。如果属性名称为foo,则该吸气剂仅命名为foo,并且该吸气剂名为setFoo:。这主要是一个约定,但Cocoa系统的一部分依赖于这个约定。所以,当你读完这个句子时,立即重新命名你的方法。