Objective-Cの中セッターについての質問
-
16-09-2019 - |
質問
これは、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];
}
}