Re: [quiz] NSImage's leak

看板MacDev作者 (藍永倫)時間16年前 (2007/11/28 17:20), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串10/11 (看更多)
※ 引述《anpig (Andrew)》之銘言: : 我想我大概大解了,不過還有一個問題,就是在accessor methods中放如上 : 的autorelease,那麼這個someMember object會被放到哪個autorelease pool呢? : 是這個someMember所屬的object中的autorelease pool還是receiver的? : 如果是前者的話,是否表示這個someMember得等到其所屬的object deallocate時 : 才會被release嗎? 並非 someMember 所屬 object 中的 autorelease pool 也非 receiver 的。 事實上一般來說,並不會有物件 "own" 某個 NSAutoreleasePool。 我說的 own 是指 instance variable 那樣。 以下我寫一個簡單版的 NSAutoreleasePool 也許更能看出來: @implementation NSAutoreleasePool // 記錄目前的 Autorelease Pool, 假設有這個 NXStack 這個 class 啦... static NXStack *poolStack; - (id) init { if (poolStack == NULL) poolStack = new NXStack(); // Singleton if (self = [super init]) { // 唔,這個 hash 記錄了被加到 pool 裡的 object 一共被加了幾次 // 同樣還是假設有 C++ 的 class 可以用... 反正看得懂就好嘛 objectAutoreleaseCountHash = new NXHash(); // instance variable poolStack->push(self); // global static } return self; } // 這就是我說的「最靠近」的意思 + (NSAutoreleasePool *) topMostPool { return poolStack->top(); } - (id) addObject: (id) obj { self->objectAutoreleaseCountHash[obj]++; return obj; } - (void) dealloc { // 連 ObjC 2.0 語法都跑出來了... 囧 同樣也是看得懂就好 for (id key in self->objectAutoReleaseCountHash) { for (int i = 0; i < objectAutoReleaseCountHash[key]; i++) [key release]; } poolStack->pop(); [super dealloc]; } @end 然後一般的 autorelease 是這樣實作的: @implementation NSObject - (id) autorelease { return [[NSAutoreleasePool topMostPool] addObject: self]; } @end 所以當你產生了一個新的 Pool,他會被推到某個 Stack 上,而收到 autorelease 的物件就會被這個 Stack 上最新產生的 Pool 所記錄。 當 Pool 自己要被 deallocate 時,就把自己移出 Stack,並且把剛剛 記錄的物件和次數給 release 回來,大致是這樣。 所以這個問題的回答是,看當時哪一個 pool 是最近產生、又沒有 dealloc'd ,就會被加到那個 pool。 : 突然想到,既然你說這個delay release會等到最靠近的autorelease pool : release時,所以是否可以把autorelease pool當作對autoreleased object : 強制release的一個機制? : (當然如果被其他object retain住的不算) ?看不太懂這段... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.163.47
文章代碼(AID): #17JJB6yJ (MacDev)
討論串 (同標題文章)
文章代碼(AID): #17JJB6yJ (MacDev)