看板 MacDev 關於我們 聯絡資訊
leondemon:順便想問一下下面兩個語意是否相同: 12/22 23:52
leondemon:self.A = nil; 12/22 23:53
leondemon:[A release]; //A為物件變數 12/22 23:53
leondemon:在dealloc的時候 要release物件變數 兩者是否都可使用? 12/22 23:54
使用 setter 的時候會 release 舊值, 所以在最常見的狀況下, [self setA:nil]; 會使得 A 的舊值被 release, nil 被 retain (which means nothing happens) 所以效果會一樣 用 setter 把值指向 nil 的額外好處是 若你不小心在其他地方搞出 memory leak(或者要考慮多執行緒之類的), 那麼 [A release]; 可能會讓 A 的值被保留 而如果你在之後的程式裡「預期」A 不存在(nil)而使用很方便的 「對 nil 呼叫 method 等於什麼事情都沒發生」這個功能 那就可能會出現很奇怪的 bug... 但是, 用 setter 設定 nil 的問題是, A 的 setter 可能做了其他事情 這對於程式碼的後續維護會造成風險 如果我沒記錯的話, 一般的建議(by Apple)是盡量在這裡用 release 只有在某些特殊需求裡有用特例的方法特別規定要用 setA:nil -- "問おう、貴方が私のマスターか?" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146
leondemon:謝謝 :) 12/23 19:20
leondemon:不過蠻好奇的 會使用setA:nil來relase的特殊情況有哪些 12/27 00:46
leondemon:如果有實際例子能夠提供的話 小弟感激不盡 12/27 00:46
zonble:GC 12/27 11:22