2010-09-20 95 views
0

正通過「開始iPad的發展」 Apress出版的書工作我的方式,並已經注意到,有時當筆者到屬性分配值,他們將使用:當使用自我以及何時使用保留

self.variable = value; 

其它時候,它們將使用:

variable = [value retain]; 

在兩種情況下可變是定義爲一個屬性:

@property (nonatomic, retain) TYPE variable; 

我想知道,如果有人知道爲什麼這樣做是爲了幫助我更好地理解

感謝, 威廉

回答

1

他們往往等同內存明智的。編譯器將self.variable = value轉換爲[self setVariable:value],然後調用生成的setter(如果您使用@synthesize)並將其保留給您。

+1

請記住,如果您手動保留它,您需要釋放該值! – Toastor 2010-09-20 14:54:46

+1

如果您也在屬性上使用retain屬性,則需要手動將其釋放。 – Echelon 2010-09-20 15:00:37

+0

感謝您的快速響應。當使用[保留值]語句時,第二個問題是來自這個變量的保留是放置在變量「值」上還是它指向的內容? – williamb 2010-09-20 15:06:43

3

你使用第二種形式的一個地方是如果你正在定義你自己的setter方法。你不能在那裏分配self.variable,因爲你會遞歸地調用setter。因此,例如,這是錯誤的:

-(void)setVariable:(TYPE*)value { 
    if (value != variable) { 
     [variable release]; 
     self.variable = [value retain]; // WRONG! Calls 
             // [self setVariable:[value retain]] 
    } 
} 

這是正確的:

-(void)setVariable:(TYPE*)value { 
    if (value != variable) { 
     [variable release]; 
     variable = [value retain]; 
    } 
} 

這是否幫助?

+1

這有一個潛在的錯誤:如果你調用'obj.var = obj.var',你可能會釋​​放並釋放對象,然後再保留它。 – cobbal 2010-09-20 15:00:02

+0

感謝您的回覆我可以看到,如果它是在您的代碼中是一個討厭的錯誤 – williamb 2010-09-20 15:15:57

+0

cobbal:如果您調用obj.val = ob.val',則value!= variable'將評估爲false並且代碼在if塊內部不會被調用。 – 2010-09-20 19:28:23

相關問題