2009-07-16 11 views
3

これはObjective-C 2.0プログラミング言語の例です。 私はちょうど底のセッターで、value = [newValue retain] の代わりにvalue = [newValue copy]を使うことができますか?objective-cのセッターに関する質問

@interface MyClass : NSObject 

{ 

    NSString *value; 

} 

@property(copy, readwrite) NSString *value; 

@end 



// assume using garbage collection 

@implementation MyClass 

@dynamic value; 



- (NSString *)value { 

    return value; 

} 



- (void)setValue:(NSString *)newValue { 

    if (newValue != value) { 

     value = [newValue copy]; 

    } 

} 

@end 

答えて

7

@synthesize valueを実装の先頭に追加するのが最も簡単で安全な方法です。コンパイラは自動的にこれらのメソッドを生成します。

コピーとリテインの問題は、値を変更するNSMutableStringで渡すことができるという事実に基づいています。 '不変'型(文字列、集合、配列、辞書)のセッターがある場合は、copyセマンティクスを使用する必要があります。最初はこれは直感的ではないかもしれません(なぜそれが不変ならばコピーを作るのですか?)しかし、あなたのクラスはそれが不変であると仮定したいと思っていて、渡されるのは実際に不変ではないかもしれないということです。

NSMutableクラスは、表現するものの不変バージョンを返すことによってcopyセレクタを実装します。不変クラス(NSStringなど)はcopyretainという呼び出しを実装します。つまり、彼らは非常に速いです。

セッターは、valueをリリースしてから新しい値を割り当てる必要があります。

-(void)setValue:(NSString*)newvalue 
{ 
    if (value != newvalue) 
    { 
     [value release]; 
     value = [newvalue copy]; 
    } 
} 

あなたがsetValue:を呼び出すと、あなたは、あなたがretainを使用することができますNSMutableStringを渡すことはありません絶対に確信している可能性のあるすべてのクラスを完全に制御を持っている場合、それはcopyを使用するためのベストプラクティスです:適切なコードがあります。

+0

いつもcopyを使うのは良い考えですか?また、NSString *値を@property(保持、コピー、読み書き)することができますが、その効果は何ですか?ありがとうございます – derrdji

+0

それはコンパイルされませんでした。クラスの可視性からアイテムを変更できないようにするにはコピーを使用することをお勧めします。値を表さないもの(例えば、UIコンセントプロパティ)にプロパティがある場合、retainを使用します。 – Jason

0

いいえ、インターフェイスにはcopyと表示されます。誰かがNSMutableStringを渡すと、2つのメソッドとは非常に異なる結果になります。

+0

、教会は、[値]プロパティのあなたの宣言を意味します。両方とも 'copy'または' retain'でなければなりません。 – notnoop

+0

コピーを使用することで、ランタイムエラーを回避するためにタイプチェックをスキップできます。そのアイデアですか? – derrdji

0

です。 [newValue retain]を使用する場合、別のオブジェクトがこのNSStringポインターの値を変更することがあります。通常、あなたはこの振る舞いをしたくありません。

0

setterメソッド:APIによって

-(void)setValue:(NSString*)newvalue{ 
     if (_value != newvalue) 
     { 
      [_value release]; 
      _value = nil; 
      _value = [newvalue copy]; 

     } 
    }