在objective-c中以这种方式遍历对象图是否有效?

时间:2011-08-28 14:30:29

标签: 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 );

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

2 个答案:

答案 0 :(得分:3)

从理论上讲,这并没有错。但是:

  1. 通常在Objective-C中,您只需使用NSArrayNSSet,而不编写自己的链表类。请注意,NSArray实际上并不是标准意义上的数组。例如,在中间插入对象并不是非常慢。
  2. 正如WTP所述,您没有为getter get...命名。如果属性名称为foo,则getter名为foo,setter名为setFoo:。它主要是一种约定,但Cocoa系统的某些部分依赖于这种约定。所以,当你读完这句话后,立即重命名你的方法。

答案 1 :(得分:2)

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

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