看板 MacDev 關於我們 聯絡資訊
※ 引述《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
davll:ref count應該是系統內的東西吧(user不必管這個東西) 07/18 16:45
angelyin:謝謝~瞭解了^^ 07/18 21:58
huggie:能弄懂 ref count 對會比較容易了解吧 07/19 12:25
angelyin:請問一下如果上述的例子裡,string如果是local變數的話 07/22 01:23
angelyin:那離開那個function,值不就無效了,那記憶體也不會釋放嗎? 07/22 01:25
angelyin:如果會的話,那也不需要release啦? :p 07/22 01:28
Blueshiva:ObjC裡面的NSString是個物件,而物件在ObjC裡面都是以 07/22 02:30
Blueshiva:pointer的方式來使用,所以在上面的code裡面必須配置記 07/22 02:31
Blueshiva:憶體給string,也因此必須有對應的釋放動作 07/22 02:31
neeklee:雖然string是local變數,不過string內所存的值其所表示的 10/06 17:55
neeklee:記憶體區塊是位於程式執行時,系統給的heap區塊。heap區塊 10/06 17:56
neeklee:內的資料不會隨著函式(method or function)返回之後消失 10/06 17:57
neeklee:所以需要記得release heap內的物件資料。而 string 這個 10/06 17:58
neeklee:變數離開函式之後的確就會消失了(string變數是放在stack, 10/06 17:59
neeklee:非heap內) 10/06 17:59