2010-12-05 19 views
3

プロパティを保持するオブジェクトがsetterを保持している場合、これらはどれがベストプラクティスですか?retainプロパティを扱う最良の方法

-(id)init { 
    if((self = [super init])) { 
     self->_retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 
-(id)init { 
    if((self = [super init])) { 
     self.retainingProperty = [[NSObject alloc] init]; 
     [self.retainingProperty release]; 
    } 
    return self; 
} 
-(id)init { 
    if((self = [super init])) { 
     NSObject *obj = [[NSObject alloc] init]; 
     self.retainingProperty = obj; 
     [obj release]; 
    } 
    return self; 
} 

これらのすべては、おそらく私は「別の方法があるのdealloc

でのリリースと結合されます逃した。

答えて

4

は、私は一般的にだけ実行します。

- (id) init 
{ 
    self = [super init]; 

    if (self) 
    { 
     retainingProperty = [[NSObject alloc] init]; 
    } 

    return self; 
} 

あなたは、彼らはあなたが意図していないKVOのものを呼び出す可能性が認識している場合を除き、私は、#2、#3を示唆しています。

+0

私はこれが行く方法だと思います。しかし、オブジェクトの存続期間中に 'retainProperty'が再び変更されなければ、プロパティーセッターは代わりにデフォルトの代入になります。しかし、この場合、プロパティはdeallocで解放する必要があり、混乱を招く可能性があります。 – Nick

1

上記のすべては、細かく、広く同等です。また、単にその名前を使用してメンバ変数にアクセスすることができます。

-(id)init { 
    if((self = [super init])) { 
      _retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 

プロパティのセッターは本当にあなたが正しく物事をやっている場合は、あなたがそれらなしで行うことができますので、保持/解放のダンスが正しく行われていることを確認するだけで便利なメソッドです。

カスタムロジックをセッターメソッドに追加した場合は、常にプロパティセッター構文​​を使用して呼び出されるようにすることができます。あるいは、意図的にそのロジックを回避したい場合があります。したがって、そのロジックを使用しないでください。あなたのユースケースに適したものは、あなた次第です。

1

少なくとも2つの他の方法がすぐに思い浮かびます。ダイレクトIVARアクセスがあります:

- (id) init 
{ 
    if (self = [super init]) 
    { 
     _retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 

それとも、自動解放プール使用することができますプロパティのクラスに応じて

- (id) init 
{ 
    if (self = [super init]) 
    { 
     self._retainingProperty = [[[NSObject alloc] init] autorelease]; 
    } 
    return self; 
} 

を、また後者に相当便利なメソッドがあるかもしれません。

個人的には、私はほとんど常に直接的なivarアクセス​​に行きます。 initのプロパティアクセサーを呼び出すのは、通常、オブジェクトが不完全に初期化されている間に発生したくない副作用がある可能性があるため、悪い形式とみなされます。

同様の考慮事項がdeallocに適用されます。btw:プロパティアクセサを使用するのではなく、releaseのivarsを直接使用する方がよいでしょう。

+0

私は自動解放メソッドを考えました。しかし、これにより、オブジェクトが必要以上に長くぶら下がる可能性がありますか? – Nick

+1

@ニックそれはかなり早くそれを変更することを期待している場合のみ可能性があります。とにかくそれを保持するものにここで割り当てているとすれば、おそらくそれはちょっと気にしていないでしょうか?そのため、自動リリースはオブジェクト自体の前にある可能性があります。一般に、自動解放の遅延は、スペースが非常に限られているか、非常に大きなオブジェクトを使用していない限り、心配する価値はありません。しかし、私は実際にはこの可能性が存在することを観察するだけで、これを推奨するわけではありません。 – walkytalky

+0

ありがとう、分かった。 – Nick

関連する問題