、コードはこれとほぼ類似した何かを(我々はname
は、プロパティ名である必要があります、と_name
は、インスタンス変数になりますそれは参照しています):
- (void) setName: (NSString *) newValue
{
if (newValue == _name)
return;
[newValue retain];
[_name release];
_name = newValue;
}
ここでは、上記のプロパティ宣言に基づいて何が起こるかを示しています。そのプロパティの他の可能な属性に応じて、その関数は[newValue retain]
の代わりに[newValue retain]
( 'copy'属性が指定された場合)のいずれかを使用するか、@synchronized(self)
ブロックでラップされます( '非原子的'属性がが提供されます)。合成されたセッターを使用するようになります
@property (nonatomic, copy) NSString * name;
:私はまた、つまり、あなたの財産は、NSCopyingプロトコルを実装NSStringの、を意味しているので、あなたが本当にコピーを使用してではなく、維持されなければならないことに注意しなければならない
-retain
の代わりに-copy
を使用します。これは、実際にNSMutableStringオブジェクトが渡されたときに安全です。不変の文字列は最終的には-copy
呼び出しによって保持されますが、変更可能な文字列は新しい不変のコピーを作成します。そうしないと、文字列自体がセッターに渡された後に文字列自体が変更され、オブジェクトの知識なしに値が変更される可能性があります。
NSMutableStringを変更できるようにしたい場合でも、新しい値に対してmutableCopyを実行する合成セッターをオーバーライドする必要があります。そうすれば、オリジナルは安全ですし、必要な場合は文字列のコピーを変更することができます。 – Abizern
うん、あなたはNSMutableStringとしてあなたのプロパティを定義したいと思います。NSStringは 'クラスクラスタ'なので、NSString *サブクラス*のインスタンスを実際に取得することになるので、NSStringは実際には
[str isKindOfClass: [NSMutableString class]]
を使ってNSMutableStringかどうかをチェックすることはできません。NSMutableStringサブクラス。あなたの最善の策は、-mutableCopy
を使用することです。受信者が既に変更可能な場合はそのまま残ります。 –