(IOS)Assign VS Retain VS Copyの3つの違いと分析のまとめ
assign VS retain
assignは、基本的には単純なデータ型のために用意されており、NSオブジェクトたちではなくCGPoint、CGFloatなどの原子類タイプである.
retain:古いオブジェクトを解放し、古いオブジェクトの値を入力オブジェクトに与え、入力オブジェクトのインデックス数を1にします.
両者の違い:はCに接触したことがあるので、mallocでメモリを割り当て、そのアドレスをポインタaに割り当てたと仮定します.その後、ポインタbもこのメモリを共有することを望んで、そこであなたはまたaをbに割り当てました.このときaとbは同じメモリを指していますが、aがこのメモリを必要としなくなったら、直接解放してもらえますか?答えは否定的です.aはbがまだこのメモリを使用しているかどうか分からないので、aが解放されると、bはこのメモリを使用するときにプログラムcrashを落とすことになります. は1のassignの問題を知っていますが、どうやって解決しますか?最も簡単な方法は、リファレンスカウント(reference counting)を使用するか、または上記の例では、メモリにリファレンスカウントを設定し、メモリが割り当てられ、aに付与された場合、リファレンスカウントは1である.aをbに付与すると参照カウントは2に増加する.この場合、aがこのメモリを使用しなくなった場合、参照カウントを1ずつ減らして、自分がこのメモリを持っていないことを示すだけです.bこのメモリを使用しなくなった場合も参照カウントを1に減らします.参照カウントが0になると、メモリがポインタで参照されなくなり、システムは直接解放することができます. 上の2点はassignとretainの違いであり、assignは直接付与され、1の問題を引き起こす可能性があり、データがint、floatなどの原生タイプの場合、assignを使用することができる.retainは2で述べたように,参照カウントを用い,retainは参照カウントに1を加え,releaseは参照カウントを1減らし,参照カウントが0の場合dealloc関数が呼び出され,メモリが回収される.
retain VS copy
retain:古いオブジェクトを解放し、古いオブジェクトの値を入力したオブジェクトに与え、入力したオブジェクトのインデックス数を1にします.
copy:インデックス数が1のオブジェクトを作成し、古いオブジェクトを解放します.
copyは、aとbがメモリを共有したくないときに使用されます.aとbはそれぞれ自分のメモリを持っている.
両者の違い:
Copyは実際には同じオブジェクトを作成していますが、retainは次のようなものではありません.
例えばNSStringオブジェクトで、アドレスは0です.×1111、内容は@“STR”
別のNSStringにコピーした後、アドレスは0です.×2222,内容は同じで,新しいオブジェクトretainは1であり,古いオブジェクトは変化しない.
retainが別のNSStringになった後、アドレスは同じ(ポインタを作成し、ポインタをコピーする)、内容はもちろん同じで、このオブジェクトのretain値+1
すなわちretainはポインタコピー,copyはオブジェクト(コンテンツ)コピーである.
(@property(nonmatic,coypy)NSString*foo);//一般的にNSStringタイプにはcopy、その他のタイプにはretainを使用します
コードの違い:
retain:
copy:
この2つのオブジェクトをどのように区別しますか?
Objective-Cのcopyはc++と同じ深さコピーと浅いコピーに分かれていますが、この2つのオブジェクトをどのように区別しますか?私の理解は次のとおりです.
(1)深いコピーとは,新たに1枚のメモリをオブジェクトに渡して使用することである.
(2)浅いコピーとは、コピーメモリがもったいないと思って、直接私のアドレスをあげましょう.retainに相当します.アドレスリファレンスを追加し、リファレンスカウントを1加算します.
(3)(@property(nonmatic,coypy)NSString*foo);//一般的にNSStringタイプにはcopy、その他のタイプにはretainを使用します
「*」の星号は、ポインタを指すことを知っています.ポインタの引用を意味します.多くの場合fooは変動する必要がありますが、NSStringは可変オブジェクトであり、私たちのニーズに合わせるためには、通常、深いコピーcopyを使用する必要があります.
Objective-Cでは浅いコピーしかありません.それは可変オブジェクトのcopy(弱参照)です.他は深いコピー(可変オブジェクトのmutableCopyメソッド、可変オブジェクトのcopyとmutableCopyのメソッドを含む)です.retainは可変オブジェクトのcopy(弱参照)であることがわかります.
深いコピーと浅いコピーの詳細:Objectivec深いコピー学習の概要
assignは、基本的には単純なデータ型のために用意されており、NSオブジェクトたちではなくCGPoint、CGFloatなどの原子類タイプである.
retain:古いオブジェクトを解放し、古いオブジェクトの値を入力オブジェクトに与え、入力オブジェクトのインデックス数を1にします.
両者の違い:
retain VS copy
retain:古いオブジェクトを解放し、古いオブジェクトの値を入力したオブジェクトに与え、入力したオブジェクトのインデックス数を1にします.
copy:インデックス数が1のオブジェクトを作成し、古いオブジェクトを解放します.
copyは、aとbがメモリを共有したくないときに使用されます.aとbはそれぞれ自分のメモリを持っている.
両者の違い:
Copyは実際には同じオブジェクトを作成していますが、retainは次のようなものではありません.
例えばNSStringオブジェクトで、アドレスは0です.×1111、内容は@“STR”
別のNSStringにコピーした後、アドレスは0です.×2222,内容は同じで,新しいオブジェクトretainは1であり,古いオブジェクトは変化しない.
retainが別のNSStringになった後、アドレスは同じ(ポインタを作成し、ポインタをコピーする)、内容はもちろん同じで、このオブジェクトのretain値+1
すなわちretainはポインタコピー,copyはオブジェクト(コンテンツ)コピーである.
(@property(nonmatic,coypy)NSString*foo);//一般的にNSStringタイプにはcopy、その他のタイプにはretainを使用します
コードの違い:
retain:
// For @synthesize(nonatomic, retain) foo;
- (void) setFoo(NSFoo *theFoo)
{
[theFoo retain]; // retain new value
[foo release]; // release , if any
foo = theFoo; // assign ,
}
copy:
// For @synthesize(nonatomic, copy) foo:
- (void) setFoo(NSFoo *theFoo)
{
NSFoo* newFoo = [theFoo copy]; // make copy
[foo release]; // release old value, if any
foo = newFoo; // assign new value
}
この2つのオブジェクトをどのように区別しますか?
Objective-Cのcopyはc++と同じ深さコピーと浅いコピーに分かれていますが、この2つのオブジェクトをどのように区別しますか?私の理解は次のとおりです.
(1)深いコピーとは,新たに1枚のメモリをオブジェクトに渡して使用することである.
(2)浅いコピーとは、コピーメモリがもったいないと思って、直接私のアドレスをあげましょう.retainに相当します.アドレスリファレンスを追加し、リファレンスカウントを1加算します.
(3)(@property(nonmatic,coypy)NSString*foo);//一般的にNSStringタイプにはcopy、その他のタイプにはretainを使用します
「*」の星号は、ポインタを指すことを知っています.ポインタの引用を意味します.多くの場合fooは変動する必要がありますが、NSStringは可変オブジェクトであり、私たちのニーズに合わせるためには、通常、深いコピーcopyを使用する必要があります.
Objective-Cでは浅いコピーしかありません.それは可変オブジェクトのcopy(弱参照)です.他は深いコピー(可変オブジェクトのmutableCopyメソッド、可変オブジェクトのcopyとmutableCopyのメソッドを含む)です.retainは可変オブジェクトのcopy(弱参照)であることがわかります.
深いコピーと浅いコピーの詳細:Objectivec深いコピー学習の概要