Re: [問題] 關於使用autorelease或直接使用release …

看板MacDev作者 (←這人是超級笨蛋)時間16年前 (2009/07/18 10:44), 編輯推噓5(5010)
留言15則, 5人參與, 最新討論串1/4 (看更多)
※ 引述《angelyin (等待.微笑)》之銘言: : 各位好: : 之前問過關於記憶體管理的問題 : 雖然弄懂reference counting要怎麼做了 : 可是卻產生了一些疑問 : 當我們在使用autorelease時要先建立 autorelease pool : count值是在pool release時才會真正釋放 : 請問什麼時機使用autorelease會比直接release好啊? 有時候是「不得不用」 例如你今天可能有個 getter method 需要回傳一個字串 string 這個 string 是由一個已存在的 string1 組合成 - (NSString *)string { NSString *string = [[NSString alloc] initWithFormat:@"string1 = %@", string1]; return string; } 這樣會有 memory leak, 因為你沒有把 string 這個物件 release 可是如果你寫 - (NSString *)string { NSString *string = [[NSString alloc] initWithFormat:@"string1 = %@", string1]; [string release]; return string; } 就完蛋了, 因為 string 已經被 dealloc, 沒有東西可以 return 這時候就只能用 - (NSString *)string { NSString *string = [[NSString alloc] initWithFormat:@"string1 = %@", string1]; [string autorelease]; return string; } 告訴 pool「等一下我要釋放 string」, 好先回傳這個值 等到你呼叫 [pool drain]; 的時候, pool 會自動呼叫 [string release]; : reference counting裡有dealloc這個用法 : 它可直接把count值歸零並釋放 : 如果我都有乖乖的release : 那到最後count值也會等於零啊 : 那dealloc又在什麼時候會用到呢? 你應該不會在程式裡手動呼叫 dealloc 這個東西會在程式的 reference count 歸零時自動被啟動 而且我沒看過有人在 dealloc 裡面手動把 reference count 歸零耶 因為根本沒用吧XD : 謝謝各位^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.72.123

07/18 16:45, , 1F
ref count應該是系統內的東西吧(user不必管這個東西)
07/18 16:45, 1F

07/18 21:58, , 2F
謝謝~瞭解了^^
07/18 21:58, 2F

07/19 12:25, , 3F
能弄懂 ref count 對會比較容易了解吧
07/19 12:25, 3F

07/22 01:23, , 4F
請問一下如果上述的例子裡,string如果是local變數的話
07/22 01:23, 4F

07/22 01:25, , 5F
那離開那個function,值不就無效了,那記憶體也不會釋放嗎?
07/22 01:25, 5F

07/22 01:28, , 6F
如果會的話,那也不需要release啦? :p
07/22 01:28, 6F

07/22 02:30, , 7F
ObjC裡面的NSString是個物件,而物件在ObjC裡面都是以
07/22 02:30, 7F

07/22 02:31, , 8F
pointer的方式來使用,所以在上面的code裡面必須配置記
07/22 02:31, 8F

07/22 02:31, , 9F
憶體給string,也因此必須有對應的釋放動作
07/22 02:31, 9F

10/06 17:55, , 10F
雖然string是local變數,不過string內所存的值其所表示的
10/06 17:55, 10F

10/06 17:56, , 11F
記憶體區塊是位於程式執行時,系統給的heap區塊。heap區塊
10/06 17:56, 11F

10/06 17:57, , 12F
內的資料不會隨著函式(method or function)返回之後消失
10/06 17:57, 12F

10/06 17:58, , 13F
所以需要記得release heap內的物件資料。而 string 這個
10/06 17:58, 13F

10/06 17:59, , 14F
變數離開函式之後的確就會消失了(string變數是放在stack,
10/06 17:59, 14F

10/06 17:59, , 15F
非heap內)
10/06 17:59, 15F
文章代碼(AID): #1AOJS7mN (MacDev)
文章代碼(AID): #1AOJS7mN (MacDev)