2011-07-27 5 views

答えて

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

Saschaが指摘しているように、カスタムセッターを提供する場合は、自分でリファレンスをリリース/保持することが期待されます。 – devios1

+0

カスタムgetterとsetterは通常のSELECTORと似ていますので、yourSetter:は末尾にコロン – onmyway133

0

それはおそらく

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

@Saschaはほとんど正しいですが、彼のコードは、その中に小さなバグがあるようなものになるはずです

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

を実装;)

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文が必要なのでしょうか?

同じオブジェクトを2回渡すとどうなりますか?

すなわち

// 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にしようとします。

NB私たちはオプション(B)でif文を必要としません。なぜなら、autoreleaseは即座にボタンを解放しないため、deallocされないまま再び保持する時間があるからです。

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; 
    } 
} 

この溶液をが、のサブオブジェクトである問題を防ぐことができます。 そして、cancelをNSURLConnectionに、invalidateをNSTimerまたはNSPortに、デリゲートにはnilを追加することができます。

0

かかわらず、あなたが同じオブジェクトを割り当てるかどうかの、私はこれは@synthesisedセッターはそれを行う方法であると信じて、それがすべての状況で動作します。

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

は限り私ができるように、間違って行くことができません見る。