@propertyにはどんな修飾語がありますか?および作用の総括

3081 ワード

一般的な修飾語:assign,weak,strong,retain,copy,nontomic,atomic,readonly,readwrite
assign(ARC/MRC)
1.この修飾語は直接付与する意味で、整型、浮動小数点型などの基礎データ型はすべてこの修飾語を用いる
2.weak、strong、retain、copyなどの修飾語を使用していない場合は、デフォルトでassign修飾(彼らの間にはあなたと私の関係があり、一般的なポインタタイプはstrong修飾)を使用します.
3.もちろんオブジェクトはassignで修飾することもできますが、オブジェクトのカウンタには1が加算されません.(strongとの違い)
4.オブジェクトの属性を修飾するために用いる場合、オブジェクトが破棄された後、ポインタはnilを指さす.したがって、野ポインタエラー(weakとの違い)が発生します.
Weak(ARC)(オブジェクト)
1.weak弱ポインタ、修飾オブジェクトの修飾語、すなわち基本データ型(int、float)を修飾できない
2.weak修飾のオブジェクト参照カウンタに1は加算されません.つまり、直接値を付与します.
3.弱引用は引用サイクルを破るために生まれた
4.最も好まれるのは、オブジェクトが破棄されるとnilを指すためである.野ポインタエラーは発生しません.
Weakとassignの違いassignとweakは、弱い参照タイプですが、違いがあります.
1.weakで宣言された変数はスタック内で自動的に空にされ、nilに割り当てられます.
2.assignで宣言された変数はスタックにnilとして付与されない可能性があり、野ポインタエラーを引き起こす.
delegateを例にとると、MRCではdelegateがassignと宣言されているが、これは循環参照を起こさないためであり、deallocにselfを書く必要がある.delegate = nil; delegateの野ポインタエラーを起こさないように、もちろんARCではweakでdelegateを宣言するだけで自動的に解放されます.
strong(ARC)(オブジェクト)
1.直接値を割り当て、オブジェクトの参照カウンタに1を加える.
2.retainの役割をARCで代替した.
retain(MRC)
1.release旧オブジェクト(旧オブジェクトカウンタ-1)、retain新オブジェクト(新オブジェクトカウンタ+1)、次に新オブジェクトを指す
2.setメソッドでは、次のように書かれています.
if(_dog!=nil){
    [_dog release]
}
_dog = [dog retain];

copy (ARC/MRC)
copyを使用する必要がある場合:(1.属性はNSString,NSArray,NSDictionryのような可変オブジェクトである;2.NSMutablesStringを属性NSStringに割り当てるなどの可変オブジェクトを属性に割り当てる必要があるが、それ以外の場合のcopyとstrongの使用は区別がない);
1.copy MRCでは、releaseの古いオブジェクト、古いオブジェクト参照カウンタを1減らし、retainの新しいオブジェクトの参照カウンタを1加算し、新しいオブジェクト(深いコピーでも浅いコピーでも、最終的にそのオブジェクトを指す)を指します.setメソッドにこう書いてあります
if(_dog!=nil){
    [_dog release]
}
_dog = [dog copy];

2.copyはARCでこのようにして、copyは新しいオブジェクトで、新しいオブジェクトの参照カウンタは1を加えて、それから新しいオブジェクトを指します.setメソッドでは、次のように書かれています.
_dog = [dog copy];

3.使用上の注意:
  • 修飾の属性自体は可変でなければならない.たとえば、NSMutableArrayはcopyで修飾され、addObjectではCrashが発生します.NSMutableArrayのオブジェクトはcopyではNSArrayになります.NSMutableArrayオブジェクトをコピーする必要がある場合はmutableCopyを使用します.
  • NSCopyingプロトコルに準拠するオブジェクトは
  • を使用する.
    nonatomic(ARC/MRC)
    1.set、getメソッドに同期ロックを付けない
    2.性能が良い
    3.スレッドが安全でない
    atomic(ARC/MRC)
    1.原子属性とは、生成されたsetメソッドに反発ロックを加えることである(反発ロックは同期ロックであり、反発ロック:共有データが既に他のスレッドにロックされている場合、スレッドはスリープ状態で待機ロックに入り、アクセスされたリソースがロック解除されると、リソースへのアクセスを待つスレッドが呼び覚まされる.スピンロック:共有されたデータがすでに他のスレッドにロックされている場合、スレッドはデッドサイクルで待機ロックされ、アクセスされたリソースがロック解除されると、リソースを待つスレッドはすぐに実行される.スピンロックの効率は反発ロックより高い)
    @synchronized(   ) 。
    @synchronized(self) { _delegate = delegate;}
    

    2.システムリソースの消費が必要
    3.反発ロックはスレッド同期で実現され、同じ時間にset、setメソッドを呼び出すスレッドが1つしかないことを保証することを意味する.
    nonatomicとatomicの紹介と違い
    atomicを使用すると、属性の読み取りと書き込みは原子的ですが、スレッドAが書き込み操作を行うと、他のスレッドの読み取りまたは書き込み操作が待機するスレッドエラーが発生する可能性があります.Aスレッドの書き込みが終了すると、Bスレッドが書き込みを行い、これらの異なるスレッドのすべての操作が順次実行されます.すなわち、1つのスレッドがgetter/setterを実行している場合、他のスレッドは待たなければなりません.スレッドCがAスレッドの読み取り操作の前にこの属性をreleaseした場合、プログラムがクラッシュすることもあります.したがってatomicだけではスレッドを安全にすることはできません.また、スレッドにlockを追加してスレッドの安全を確保します.
    より正確には読み書きが安全であるべきだが、スレッドが安全ではない.他のスレッドは読み書き以外の操作もできるからだ.スレッドセキュリティは開発者自身が保証する必要があります.