看板 MacDev 關於我們 聯絡資訊
各位先進好 小弟最近發現XCode 4在程式專案有幾個可能會有memory leak的warning。(以前XCode 3 好像沒有) 仔細去追究之後發覺,幾個小弟程式上引發memory leak warning的原因。 1. 在ViewDidUnload函式裏,如果要將property釋放就必需要在裏面加 self.member = nil; 這個時候,如果self.member = nil寫成member = nil好像會有問題。 2. 在dealloc函式裏,因為property的retain,所以要加[member release]; 這個時候,如果用[self.member release];也會有問題。 小弟有點搞混,self.member指的是透過Getter或Setter來存取?member是直接存取? self.member跟member在使用上,差別到底在哪? 可能是之前XCode 3沒有出warning,而且程式也正常work沒發生leak才沒去了解。 但這次,真希望可以搞清楚。希望大大們指導一下。感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.96.32.184
hsc0927:通常 Setter 裡會先 release 掉舊值再 retain 新值, 09/20 12:18
hsc0927:所以用 setter 的方式,通常不會有 leak,直接 assign 09/20 12:19
hsc0927:的話,要自己處理 release 或放到 autorelease pool。 09/20 12:20
popcorny:self.member是用property. 而member是直接存取.. 09/20 14:29
popcorny:而property的memory管理是靠(retain,assign,copy)來決定 09/20 14:30
iwayne:感謝上面二位大大,那看來我的理解是沒錯的。所以,在使用 09/20 17:59
iwayne:基本上最好用self.member用property方式,依(retain,..) 09/20 17:59
iwayne:比較方便。那動作原理是不是當ViewDidUnload發生時,先透過 09/20 18:00
iwayne:Setter送nil進去,讓setter retain nil,並release舊的。 09/20 18:01
iwayne:然後,dealloc時,再去直接針對member release。就算那時候 09/20 18:01
iwayne:member是nil,送release也沒關係。我這樣理解對嗎? 09/20 18:02
iwayne:但是為什麼不直接dealloc release member就好,還要事先去 09/20 18:05
iwayne:對setter送nil呢?@@" 09/20 18:05
aecho:objC內建null object pattern,release之後順手設成nil。 09/21 16:05
aecho:之後nil不管做什麼事,都不會有動作。 09/21 16:06