質問

これは、Objective-Cの2.0プログラミング言語の一例です。 私はちょうど私がvalue = [newValue retain]を使用することができ、下部のセッターで、思っていました 代わりにvalue = [newValue copy]の?

    @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
役に立ちましたか?

解決

行うための最速かつ最も安全なものは実装の先頭に@synthesize valueを追加することですし、コンパイラが自動的にこれらのメソッドを生成します。

コピーの問題は対あなたは、その値を変更しますNSMutableStringに渡すことができるという事実にヒンジを保持しています。あなたが「不変」タイプ(文字列、集合、配列、辞書)のためのセッターを持っている場合は、copyセマンティクスを使用する必要があります。まず、これは直感に反するように見えることがあり(それは不変だ場合、なぜコピーを作成する?)が、実現することは、あなたのクラスは、それが不変であると仮定したい、と何が実際に不変ではないかもしれないで渡されたということであるでます。

NSMutableクラスは、彼らが何を表すかの不変のバージョンを返すことによってcopyセレクタを実装します。不変クラス(NSStringの、など)copy呼び出しでretainを実装します。それは、彼らは非常に高速です、と言うことです。

あなたのセッターもそれに新しい値を割り当てる前にvalueを解放する必要があります。適切なコードがあります:

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

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

他のヒント

これは依存しています。あなたが[newValue retain]を使用する場合は、別の目的は、このNSStringポインタの値を変更することがあります。通常は、この動作を持って好きではありません。

いいえ、あなたのインターフェイスはcopy氏は述べています。誰かがNSMutableStringに合格した場合、次の2つの方法から非常に異なる結果が得られます。

setterメソッドます:

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

        }
   }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top