許多地方在示例代碼中我看到了2種不同的@synthesize變量。例如,我在這裏取1個樣本按鈕。 @property(強,非原子)IBOutlet UIButton * logonButton;這2 @synthesize模式和建議哪個有什麼區別?
1. @ synthesize logonButton = _logonButton;
2. @ synthesize logonButton;
這2種方法中哪一種被推薦?
許多地方在示例代碼中我看到了2種不同的@synthesize變量。例如,我在這裏取1個樣本按鈕。 @property(強,非原子)IBOutlet UIButton * logonButton;這2 @synthesize模式和建議哪個有什麼區別?
1. @ synthesize logonButton = _logonButton;
2. @ synthesize logonButton;
這2種方法中哪一種被推薦?
簡短回答
第一種方法是優選的。
長的答案
第一個例子是聲明,對於logonButton
財產所產生的伊娃應該_logonButton
,而不是默認生成的伊娃這將具有相同的名稱與屬性(logonButton
)。
這樣做的目的是幫助防止內存問題。您可能會無意中將一個對象分配給您的ivar而不是您的財產,然後它不會被保留,這可能會導致您的應用程序崩潰。
例
@synthesize logonButton;
-(void)doSomething {
// Because we use 'self.logonButton', the object is retained.
self.logonButton = [UIButton buttonWithType:UIButtonTypeCustom];
// Here, we don't use 'self.logonButton', and we are using a convenience
// constructor 'buttonWithType:' instead of alloc/init, so it is not retained.
// Attempting to use this variable in the future will almost invariably lead
// to a crash.
logonButton = [UIButton buttonWithType:UIButtonTypeCustom];
}
就是說自動生成的組/該屬性獲取方法是使用具有不同名稱的實例變量 - _logonButton。
-(void)setLogonButton:(UIButton)btn {
_logonButton = [btn retain]; // or whatever the current implementation is
}
意思是自動生成的設置/獲取屬性方法是使用具有相同名稱logonButton伊娃。
-(void)setLogonButton:(UIButton)btn {
logonButton = [btn retain]; // or whatever the current implementation is
}
在ARC條件不過,我看不出有什麼區別。也許alloc/init方法會產生一些差異 –
@KaanDedeoglu在使用ARC來使用下劃線ivar裝飾時,我仍然覺得它很重要。比如說你創建了一個自定義的getter/setter,並且在裏面添加了一些特殊的邏輯。如果您不小心直接設置伊娃,您將繞過該邏輯,並有可能使應用程序的數據處於不需要的狀態。 [本文](http://weblog.bignerdranch.com/463-a-motivation-for-ivar-decorations/)推斷未能在ARC上使用下劃線裝飾時的潛在問題。 – FreeAsInBeer
@FreeAsInBeer:感謝深度信息。這真的很有幫助。 –