copy
のretain
とNSString
の違いは何ですか?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
一般的な設定では、オブジェクトを保持すると、保持カウントが1つ増えます。これは、オブジェクトをメモリに保持し、吹き飛ばされるのを防ぐのに役立ちます。これは、あなたが保持バージョンのみを保持している場合、あなたは共有をあなたに渡した人とコピーすることを意味します。
オブジェクトをコピーしても、それを行う場合は、duplicate値を持つ別のオブジェクトを作成する必要があります。これをクローンと考えてください。あなたはそれをあなたに渡した人とクローンを共有しません。
特にNSString
sを扱う場合、NSString
を提供している人が本当にNSString
を提供しているとは想定できない場合があります。誰かがあなたにサブクラス(この場合はNSMutableString
)を渡した可能性があります。これは、それらが潜在的に値を変更する可能性があることを意味します。アプリケーションが渡された値に依存していて、誰かがそれを変更した場合、問題が発生する可能性があります。
保持とコピーは2つの異なるものです。1つ目は概念的に参照渡しであり、2つ目は値渡しです。
retain:作成されたオブジェクトに対して行われ、参照カウントを増やすだけです。
copy-新しいオブジェクトが作成され、新しいオブジェクトが作成されると、保持カウントは1になります。
Uのためにこのヘルプを願っています... :)
古い投稿ですが、質問に対する私の見解です
Retainは、オブジェクトの保持カウントを1増やし、オブジェクトの所有権を取得します。
一方、copyはメモリロケーションに存在するデータをコピーして変数に割り当てます。したがって、copyの場合は、最初にデータをロケーションからコピーして、保持カウントを増やす変数に割り当てます。
保持は参照で機能し、コピーは値で機能することを覚えておいてください
保持を使用すると、ポインタ値が元の値からコピーされます。また、参照カウントが1ずつ増加します。しかし、コピーの場合は、ポインターによって参照されるデータを複製し、それをコピーのインスタンス変数に割り当てます。
最大の違いは、copy
を使用する場合、コピーするオブジェクトはNSCopying
プロトコルを実装する必要があることです(非常に簡単です)。すべてのオブジェクトがそれを実装しているわけではないので、copy
を呼び出そうとするときに、どのタイプに対して操作するか(またはそのプロトコルのサポートをチェックするか)を確認する必要があります。
copy
を使用するための最良の経験則は、NSStringプロパティを保持ではなく常に「コピー」に設定することです。そうすることで、オブジェクトが保持している文字列をめちゃくちゃにして忘れてしまった場合に、Leaks計測器からより正確な測定値を取得できます。コピーの他の用途は、より慎重に検討する必要があります。
コピー: レシーバーのコピーである新しいインスタンスを作成します。つまり、2つの異なる
保持: レシーバーのretainCount
を増やします。オブジェクトはメモリから削除されます-(deallocを使用して)、retainCountが0の場合。
オブジェクトを保持するとは、保持カウントが1つ増えることを意味します。つまり、オブジェクトのインスタンスは、保持カウントがゼロになるまでメモリに保持されます。プロパティはこのインスタンスへの参照を格納し、同じインスタンスを保持している他のユーザーと共有します。コピーは、オブジェクトが重複する値で複製されることを意味します。他の人と共有することはありません。
保持属性は、別のメモリを保持できるように指定されています。つまり、別のアドレスをポイントするように作成することもできます。最初にアドレスをコピーしてから保持します。