作者iwayne (Wayne)
看板MacDev
標題[請益] self.member跟member的差別?
時間Tue Sep 20 11:49:25 2011
各位先進好
小弟最近發現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
1F:推 hsc0927:通常 Setter 裡會先 release 掉舊值再 retain 新值, 09/20 12:18
2F:→ hsc0927:所以用 setter 的方式,通常不會有 leak,直接 assign 09/20 12:19
3F:→ hsc0927:的話,要自己處理 release 或放到 autorelease pool。 09/20 12:20
4F:推 popcorny:self.member是用property. 而member是直接存取.. 09/20 14:29
5F:→ popcorny:而property的memory管理是靠(retain,assign,copy)來決定 09/20 14:30
6F:→ iwayne:感謝上面二位大大,那看來我的理解是沒錯的。所以,在使用 09/20 17:59
7F:→ iwayne:基本上最好用self.member用property方式,依(retain,..) 09/20 17:59
8F:→ iwayne:比較方便。那動作原理是不是當ViewDidUnload發生時,先透過 09/20 18:00
9F:→ iwayne:Setter送nil進去,讓setter retain nil,並release舊的。 09/20 18:01
10F:→ iwayne:然後,dealloc時,再去直接針對member release。就算那時候 09/20 18:01
11F:→ iwayne:member是nil,送release也沒關係。我這樣理解對嗎? 09/20 18:02
12F:→ iwayne:但是為什麼不直接dealloc release member就好,還要事先去 09/20 18:05
13F:→ iwayne:對setter送nil呢?@@" 09/20 18:05
14F:推 aecho:objC內建null object pattern,release之後順手設成nil。 09/21 16:05
15F:→ aecho:之後nil不管做什麼事,都不會有動作。 09/21 16:06