2011-11-03 15 views
6

をNSStringプロパティに使用しなければならないと多くの議論があります。しかし、なぜ我々は読み取り専用のプロパティを設定しないでください?私の質問に答えるためのNSStringプロパティのcopyまたはreadonly?

更新

感謝。しかし、事はNSStringプロパティのために、あなたはいつも他の人にそれを変更させたくないのですか?あなたはそれを自分で修正するかもしれませんが、間違いなく修正することができます私はほとんどの場合、NSStringはその初期値を(あなたか他の人のどちらかによって)設定した後、あなただけがそれを変更すると思います。それではなぜ読み込み専用のプロパティを使用しないのですか

実際に私はほとんどの時間コピーを使用します。しかし、その後私は自分のinitメソッドでこれらのセッターだけを使用することがほとんどです。だから私はそれらの場合コピーの代わりに読み取り専用を使うべきだと思う。

このようにして質問しましょう。あなたのinitメソッドでNSStringにこれらのセッターを使用するのであれば、代わりにreadonlyを使うべきです。これは合理的な結論ですか?

答えて

10

あなたのinitメソッドであなたのNSStringsにそれらのセッターだけを使うなら、代わりにreadonlyを使うべきです。これは合理的な結論ですか?

あなたは、あなたが初期化子でコピーを実行し、その後、copyreadonlyとしてそれを宣言する必要があり、部分的に構築された状態(init/dealloc)でアクセサを使用すべきではありませんので:

- (id)initWithName:(NSString *)inName 
{ 
    self = [super init]; 
    if (0 != self) { 
    name = [inName copy]; 
    } 
    return self; 
} 

より詳細にはcopyおよびreadonlyは、意味的に異なる概念である。

  • copyあなたはほとんどの場合値に興味があるので、copyを使用します。また、不変の文字列を使用するための保護手段と最適化です。

  • お客様はreadonlyを使用して、クライアントがデータの変更/設定を禁止することができます。

は一緒に、彼らだけでは、安全性の良好な程度を提供していますが、:

  • copyはまだ、クライアントがセッターを経由して、プログラムの実行中の任意の時点で値を設定することができます。

  • readonlyは、copyを意味するものではなく、保持された特性は背中の背後で変更することができます。変更可能なバリアントが渡され、クライアントがセッターを呼び出した後にそれを変更するとどうなるかを考えてください。

最も安全な方法は、copyreadonlyです。

  • 明らかに、あなたはあなたの顧客にセッターを提供する必要があるときは、readwriteを使用すると、あなたはその変更をサポートしています。

  • 通常、コピーする代わりに文字列(または配列など)を保持するのは悪い考えです。これらのタイプをコピーしないようにすることはほとんどありません。微妙なエラーにつながる可能性があります。あなたが変更可能な型を扱っているときでも、通常は変更可能なコピーが必要です(コンパイラはあなたのために合成しません)。これらのタイプを保持または割り当てることは、ほとんどあなたが望むものではありません。 1つの例外は、データがうまくカプセル化されている大規模な割り当て(例:コピーを避けるために1つの場所から別の場所に所有権を渡す重いNSMutableDataインスタンス)を扱う場合です。

+0

私の質問を更新していただきありがとうございます。 – Qiulang

+0

あなたは歓迎です)= – justin

+1

"最も安全な方法は、コピーと読み取り専用を使用することです"。しかし、それはあなたのクライアントを混乱させていませんか? readonlyはセッターを意味し、copyはセッターを意味しますか?もちろん、あなたのクライアントはあなたの.mファイルにreadwriteを追加すると推測しますが、copyとreadonlyを宣言すると、最初のところで私は混乱します。 – Qiulang

6

他人にあなたのプロパティを変更させたくない場合は、絶対にreadonlyにする必要があります。彼らが後であなたのプロパティにアクセスするとき、誰かがあなたのプロパティに文字列を割り当て、文字列が変更可能であり、それらが文字列を変更するならば、copyを使用していると言ったときの意味は何ですか? に変更されました。しかしcopyを使用すると、文字列がプロパティに割り当てられたときの文字列の見え方のスナップショットが返されます。

+0

私の質問にお答えいただきありがとうございます。しかし、事はNSStringプロパティのために、あなたはいつも他の人にそれを変更させたくないのですか?他の人はNSStringのイニシャル値を設定することができますが、あなたはそれを変更したくありませんか? – Qiulang

+1

@Qiulang:頻繁に、他の人が自分のプロパティに割り当てることができるようにします。あなたのクラスが何をしているのか、そのプロパティが何を表しているかによって、実際には異なります。 –

0

あなたは両方を行うことができます。 NSStringは不変なので、基になる文字列は変更できません。あなたは参照を変更したくないかもしれません。そのため、readonlyを使用しています。

コピーはセッターにのみ適用されますが、ゲッターは依然としてコピーではなく参照を返します。

関連する問題