Re: [問題] 簡單的程式就有 memory leak 了

看板MacDev作者 (←這人是超級笨蛋)時間10年前 (2014/04/16 13:53), 10年前編輯推噓0(005)
留言5則, 1人參與, 最新討論串3/4 (看更多)
※ 引述《darktt (小朱)》之銘言:

04/16 11:42,
RefCount降到0也不會馬上刪除,必須等autorelease pool
04/16 11:42

04/16 11:42,
要刪除的時候才會一起檢查,一起刪除
04/16 11:42
實際上 Foundation 裡面怎麼做我是不知道啦, 但這是 Cocotron 的源碼 http://d.pr/B3bo -(oneway void)release { if(NSDecrementExtraRefCountWasZero(self)) [self dealloc]; } 這是蘋果開源的 Objective-C Runtime 源碼 http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm - (oneway void)release __attribute__((aligned(16))) { // tagged pointer check is inside _objc_rootReleaseWasZero(). if (_objc_rootReleaseWasZero(self) == false) { return; } [self dealloc]; } 如果 release 之後 ref count 是 0 就會直接呼叫 dealloc 進入自爆程序了 沒記錯的話, 蘋果的文件也是說 ref count 一旦降到 0 就會立刻毀滅 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.94.57 ※ 文章網址: http://www.ptt.cc/bbs/MacDev/M.1397627628.A.E0C.html ※ 編輯: uranusjr (140.112.94.57), 04/16/2014 13:56:54

04/16 14:05, , 1F
這是要看最後call的是release還是autorelease吧?
04/16 14:05, 1F

04/16 14:06, , 2F
如果全部都call release是直接毀掉沒錯,但如果中間有call
04/16 14:06, 2F

04/16 14:07, , 3F
autorelease,那應該會push到autorelease pool
04/16 14:07, 3F

04/16 14:10, , 4F
有開arc的話,好像沒辦法自己決定用release還是autorelease
04/16 14:10, 4F

04/16 14:11, , 5F
真的很要求記憶體的話, 恐怕還是得關掉arc,全部自己來處理.
04/16 14:11, 5F
文章代碼(AID): #1JJXhiuC (MacDev)
文章代碼(AID): #1JJXhiuC (MacDev)