2011-08-28 63 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系統的一部分依賴於這個約定。所以,當你讀完這個句子時,立即重新命名你的方法。