web-dev-qa-db-ja.com

「コピー」と「保持」の違いは何ですか?

copyretainNSStringの違いは何ですか?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}
30
senthilMuthu

一般的な設定では、オブジェクトを保持すると、保持カウントが1つ増えます。これは、オブジェクトをメモリに保持し、吹き飛ばされるのを防ぐのに役立ちます。これは、あなたが保持バージョンのみを保持している場合、あなたは共有をあなたに渡した人とコピーすることを意味します。

オブジェクトをコピーしても、それを行う場合は、duplicate値を持つ別のオブジェクトを作成する必要があります。これをクローンと考えてください。あなたはそれをあなたに渡した人とクローンを共有しません。

特にNSStringsを扱う場合、NSStringを提供している人が本当にNSStringを提供しているとは想定できない場合があります。誰かがあなたにサブクラス(この場合はNSMutableString)を渡した可能性があります。これは、それらが潜在的に値を変更する可能性があることを意味します。アプリケーションが渡された値に依存していて、誰かがそれを変更した場合、問題が発生する可能性があります。

46
Malaxeur

保持とコピーは2つの異なるものです。1つ目は概念的に参照渡しであり、2つ目は値渡しです。

24
iTayb

retain:作成されたオブジェクトに対して行われ、参照カウントを増やすだけです。

copy-新しいオブジェクトが作成され、新しいオブジェクトが作成されると、保持カウントは1になります。

Uのためにこのヘルプを願っています... :)

10
iPhone NewBIe

古い投稿ですが、質問に対する私の見解です

Retainは、オブジェクトの保持カウントを1増やし、オブジェクトの所有権を取得します。

一方、copyはメモリロケーションに存在するデータをコピーして変数に割り当てます。したがって、copyの場合は、最初にデータをロケーションからコピーして、保持カウントを増やす変数に割り当てます。

保持は参照で機能し、コピーは値で機能することを覚えておいてください

6
NSDumb

保持を使用すると、ポインタ値が元の値からコピーされます。また、参照カウントが1ずつ増加します。しかし、コピーの場合は、ポインターによって参照されるデータを複製し、それをコピーのインスタンス変数に割り当てます。

5
Kester

最大の違いは、copyを使用する場合、コピーするオブジェクトはNSCopyingプロトコルを実装する必要があることです(非常に簡単です)。すべてのオブジェクトがそれを実装しているわけではないので、copyを呼び出そうとするときに、どのタイプに対して操作するか(またはそのプロトコルのサポートをチェックするか)を確認する必要があります。

copyを使用するための最良の経験則は、NSStringプロパティを保持ではなく常に「コピー」に設定することです。そうすることで、オブジェクトが保持している文字列をめちゃくちゃにして忘れてしまった場合に、Leaks計測器からより正確な測定値を取得できます。コピーの他の用途は、より慎重に検討する必要があります。

コピー: レシーバーのコピーである新しいインスタンスを作成します。つまり、2つの異なる

保持: レシーバーのretainCountを増やします。オブジェクトはメモリから削除されます-(deallocを使用して)、retainCountが0の場合。

1
mxg

オブジェクトを保持するとは、保持カウントが1つ増えることを意味します。つまり、オブジェクトのインスタンスは、保持カウントがゼロになるまでメモリに保持されます。プロパティはこのインスタンスへの参照を格納し、同じインスタンスを保持している他のユーザーと共有します。コピーは、オブジェクトが重複する値で複製されることを意味します。他の人と共有することはありません。

1
vikas bharat

保持属性は、別のメモリを保持できるように指定されています。つまり、別のアドレスをポイントするように作成することもできます。最初にアドレスをコピーしてから保持します。

0
satisharyan