作者atst2 (atst2)
看板MacDev
標題Re: [問題] 記憶體管理:當兩物件互相參考時...
時間Mon May 3 11:33:46 2010
※ 引述《leondemon (狗狗)》之銘言:
: 在不使用GC前提下
: 當AB兩物件互相參考時 會互相retain對方
: 而造成無法在不使用的時候順利release 而造成memory leak
: 例如 A和B都是相同類別
: 它都含有一個instance variable叫做list (為NSMutableArray)
: 而A的list中含有B B的List中含有A
: 然後C物件含有ref.能夠操作A
: 因此這個情況之下A的retainCount為2 B的retainCount為1
: 當C物件進行dealloc時 會releaseA 此時A的retainCount為1
: 結果A和B就成了記憶體內的孤兒....
: 這個情況通常會怎麼解決?
B* b = [B new];//count 1
A* a = [A new];//count 1
[A setB:b];// b count 2
[B setA:a];// a count 2
C* c = [C new];
[c setA:a];// a count 3
[c release];//a count 2
[b release]; b count 1, a count 1
[a release]; a count 0, b count 0
結論: retain/release 請成對
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.227.128.237
→ uranusjr:你這例子跟原 po 問的不一樣啊... 05/03 14:48
→ atst2:一樣的,原po用NSMutableArray存物件,一定會有retain的動作 05/03 17:09
→ atst2:所以A物件的retainCount是3,而非原po說的2. 05/03 17:10
→ atst2:除非原po將A物件指定給C的時候,沒有遵照retain/release的 05/03 17:11
→ atst2:規則,做擁有權的管理與轉移,否則根本不應出現他所想問的問題 05/03 17:12