2010-11-24 24 views
0

NSStringプロパティのデフォルト値を設定する推奨方法を決定しようとしています。NSStringプロパティのデフォルト値を設定する

アクセサーメソッドをクラスのinitメソッドとdeallocメソッドで使用することは安全ではないことを理解しています。私はしばしばデフォルト値を割り当てたい文字列定数を持っています。これを行うための推奨方法は何ですか(iVarはdeallocメソッドでリリースされる予定です)?例えば

私は以下のが危険であることを理解:

@property (nonatomic, copy) NSString *identifier; 
.... 

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

    if (self != nil) 
    { 
     self.identifier = @"fireSpell01"; 
    } 

    return self; 
} 

は、それは大丈夫ですか、これを実行することをお勧めします:

identifier = [@"fireSpell01" retain]; 

または私はこの作業を行う必要があります。

identifier = [[NSString stringWithString:@"fireSpell01"] retain]; 

答えて

3

をちょうどこれを行う:

identifier = @"fireSpell01"; 

文字列をretainにする必要はありません。文字列定数はプログラムの存続期間中存在し、保持または解放する必要はありません。 [[NSString stringWithString:@"fireSpell01"] retain]を実行すると、不要なコピーが作成され、無意味です。

あなたが避けたいのは、initdeallocのメソッドのプロパティ設定ツールを使用することです。セッターには、特定の状態値に依存する副作用が潜在的に存在する可能性があるため、部分的に構築された/部分的に破壊されたオブジェクトでそれらを呼びたくはありません。 initの間に、イーバールに直接割り当ててセッターをスキップするほうがずっと良いです。

+0

あなたが提案したように(割り当て解除中に)識別子が直接割り当てられたときに、そのリリースが呼び出されたらいいですか? –

+0

@Jayはい。文字列定数に対して 'retain'と' release'を呼び出すことは安全です。 NSString *を受け取るメソッドは、それがどのように割り当てられたのか分からず、同じ方法でそれを扱うことができなければなりません。 – walkytalky

関連する問題