2011-07-27 90 views

回答

22
@property (getter=yourGetter,setter=yourSetter:) UIButton *but; 
+0

另請注意,正如Sascha指出的那樣,如果您提供自定義setter,則需要您自行釋放/保留參考。 – devios1

+0

請注意,自定義getter和setter與普通SELECTOR類似,因此yourSetter:必須有尾部冒號 – onmyway133

0

實施

- (void)setBut:(UIButton *)aButton; 

它也許應該看起來像

- (void)setBut:(UIButton *)aButton { 
    [but release]; 
    but = [aButton retain]; 
    // whatever 
} 
23

@Sascha幾乎是正確的,但他的代碼中有一個微小的錯誤;)

它看起來像是:

A)

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [but release]; 
     but = [value retain]; 
    } 
} 

或B)

-(void)setBut:(UIButton *)value { 
    [but autorelease]; 
    but = [value retain]; 
} 

(A)是(非常)稍微更有效,(B)是更具有可讀性。


爲什麼我們需要在選項(A)的if語句,而不是僅僅釋放&保留@薩沙的回答?

如果您傳入同一對象兩次會發生什麼?

// We set our button for the first time 
UIButton *test = [UIButton alloc] init]; 
[self setBut:test]; 
[test release]; 


// Much later in the code, we set the button again 
[self setBut:test]; 

如果我們沒有檢查but不是一個不同的對象,我們將在我們的二傳手做的第一件事就是release它。然後我們會嘗試retain一個不存在的對象,導致崩潰。

注意我們並不需要選項(B)中的if語句,因爲autorelease不會立即釋放按鈕,所以我們有時間在不釋放按鈕的情況下再次保留它。

1

A B +)替代deanWombourne的解決方案:

-(void)setBut:(UIButton *)value { 
    [value retain] 
    [but release]; 
    but = value; 
} 

該解決方案將防止出現問題,其中一個子對象。

的A +)替代deanWombourne的解決方案:

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [value retain] 
     //insert here but's cancel, invalidate, delegate = nil, ... 
     [but release]; 
     but = value; 
    } 
} 

該解決方案將防止出現問題,其中一個子對象。 它可以讓你添加一個NSURLConnection的cancel,一個NSTimer或NSPort的invalidate,一個委託爲零,...

0

我相信這是@synthesised制定者如何做到這一點,它適用於所有情況,無論您分配相同的對象與否:

- (void)setBut: (UIButton*)aButton 
{ 
    id oldObject = but; 
    but = [aButton retain]; 
    [oldObject release]; 
} 

不能出錯,只要我能看到。

相關問題