(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:
    // 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深いコピー学習の概要