13
A
答えて
22
@property (getter=yourGetter,setter=yourSetter:) UIButton *but;
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];
}
は限り私ができるように、間違って行くことができません見る。
関連する問題
- 1. python @property setter delegation
- 2. HttpFileCollectionBase:Mocking Count-Property
- 3. C#:Generic List Property
- 4. SQLAlchemy Hybrid Property Comparator
- 5. DataTrigger with Property = ItemControl.ItemTemplate
- 6. UWP "Type" Dependency Property
- 7. WPF CustomControl - Resources Property
- 8. iOS5 @property changes
- 9. Powershell:Child Property Deflation
- 10. Lodash + TypeScript _.property iteratee shorthand
- 11. Ember Computed Property on Array
- 12. C#InvokeRequired with property getter
- 13. Get-ADComputer -filter * -property $ Variable
Saschaが指摘しているように、カスタムセッターを提供する場合は、自分でリファレンスをリリース/保持することが期待されます。 – devios1
カスタムgetterとsetterは通常のSELECTORと似ていますので、yourSetter:は末尾にコロン – onmyway133