2012-06-13 52 views
3

許多地方在示例代碼中我看到了2種不同的@synthesize變量。例如,我在這裏取1個樣本按鈕。 @property(強,非原子)IBOutlet UIButton * logonButton;這2 @synthesize模式和建議哪個有什麼區別?

1. @ synthesize logonButton = _logonButton;

2. @ synthesize logonButton;

這2種方法中哪一種被推薦?

回答

7

簡短回答

第一種方法是優選的。

長的答案

第一個例子是聲明,對於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]; 
} 
+0

在ARC條件不過,我看不出有什麼區別。也許alloc/init方法會產生一些差異 –

+1

@KaanDedeoglu在使用ARC來使用下劃線ivar裝飾時,我仍然覺得它很重要。比如說你創建了一個自定義的getter/setter,並且在裏面添加了一些特殊的邏輯。如果您不小心直接設置伊娃,您將繞過該邏輯,並有可能使應用程序的數據處於不需要的狀態。 [本文](http://weblog.bignerdranch.com/463-a-motivation-for-ivar-decorations/)推斷未能在ARC上使用下劃線裝飾時的潛在問題。 – FreeAsInBeer

+0

@FreeAsInBeer:感謝深度信息。這真的很有幫助。 –

2
  1. 就是說自動生成的組/該屬性獲取方法是使用具有不同名稱的實例變量 - _logonButton。

    -(void)setLogonButton:(UIButton)btn {
    _logonButton = [btn retain]; // or whatever the current implementation is
    }

  2. 意思是自動生成的設置/獲取屬性方法是使用具有相同名稱logonButton伊娃。

    -(void)setLogonButton:(UIButton)btn {
    logonButton = [btn retain]; // or whatever the current implementation is
    }