7

通常、NSStringにコピーを使用するため、別の場所で再設定しようとしても、プロパティは割り当てたときと同じ値のままであると理解しています。

しかし、私はこの概念を完全に理解するのに苦労しています。これは基本的にあらゆる種類のオブジェクト(NSStringだけでなく)には当てはまりませんか?

ですから、私の質問は、「「コピー」としてどのようなプロパティを設定する必要があるのか​​、そしてその理由は何ですか?」です。

4

2 に答える 2

18

文字列のように、アプリケーション内の他の大量のオブジェクトへの参照を持たない単純なデータであるオブジェクトは、コピーに最適です。

もちろん、代わりに文字列などを保持できるようになりました。これは正常に機能します。しかし、代わりに変更可能な文字列があり、それを変更した場合はどうでしょうか。これで、その文字列への参照を持つ他のすべてのオブジェクトに、その変更が表示されます。これはあなたが望むものではないかもしれません。これが、コピーが「より単純」である理由の1つです。これは、そのデータへの変更がコードのそのビットだけにローカライズされるためです。

一方、アプリ用に作成したクラスのインスタンスがあるとします。アプリ内の他のオブジェクトへの参照があり、独自の文字列や他の値が大量に含まれており、複雑な獣です。このオブジェクトをコピーするのは良い考えではないかもしれません。このオブジェクトを変更する場合は、参照を保持するすべてのオブジェクトに変更を反映させる必要がある可能性があります。そして、それをコピーしたとしても、浅いコピー(新しいインスタンスですが、ivarは同じオブジェクトを参照します)または深いコピー(すべてのivarの新しいコピーを含む新しいインスタンス)が必要ですか?また、問題のオブジェクトはサポートすら<NSCopying>できない可能性があります。つまり、技術的にはまったくコピーできません。


要約すると:

  • copy:他のオブジェクトへの内部参照がない、データの小さなアトミックビットであるオブジェクト。
  • retain:ほぼすべての他の種類のオブジェクト。
于 2012-10-13T22:48:09.220 に答える
7

クライアントコードは、NSMutableStringオブジェクトをNSStringプロパティに割り当てることができます。プロパティがstrongまたはその他の非コピー属性として定義されている場合、クライアントが後で可変文字列を変更すると、プロパティの値は異なります。プロパティを「copy」に設定すると、文字列値のコピーが作成され、値が背後で変更されないようになります。

したがって、基本的に、プロパティが変更可能な対応物を持つタイプのものであり、値が変更されないようにする場合は、常にコピーを使用する必要があります。

于 2012-10-13T22:45:12.003 に答える