:私は、各属性を使用しなければならないとき、誰かが詳細に私に説明することができnonatomic
、copy
、strong
、weak
、およびので、上の宣言されたプロパティのために、それぞれが何をするかを説明しますか?ある種の例も素晴らしいでしょう。ARCを使用しています。
:私は、各属性を使用しなければならないとき、誰かが詳細に私に説明することができnonatomic
、copy
、strong
、weak
、およびので、上の宣言されたプロパティのために、それぞれが何をするかを説明しますか?ある種の例も素晴らしいでしょう。ARCを使用しています。
回答:
この回答には多数のエラーがあり、古くなっています。他の質問/回答とコメントをご覧ください。
非原子
nonatomic
マルチスレッドの目的で使用されます。宣言時に非アトミック属性を設定した場合、そのオブジェクトへのアクセスを必要とする他のスレッドは、それにアクセスして、マルチスレッドに関して結果を与えることができます。
コピーする
copy
オブジェクトが変更可能な場合に必要です。現時点でオブジェクトの値が必要であり、その値にオブジェクトの他の所有者による変更を反映させたくない場合は、これを使用します。コピーを保持しているので、オブジェクトを使い終わったら、オブジェクトを解放する必要があります。
割当
Assign
はやや反対copy
です。assign
プロパティのゲッターを呼び出すと、実際のデータへの参照が返されます。通常、プリミティブ型(float、int、BOOL ...)のプロパティがある場合にこの属性を使用します。
保持する
retain
属性がオブジェクトへのポインタである場合は必須です。によって生成されたセッターは@synthesize
、オブジェクトを保持します(別名、保持カウントを追加します)。使い終わったら、オブジェクトを解放する必要があります。保持を使用することにより、保持カウントが増加し、自動解放プールでメモリが占有されます。
強い
strong
Objective-C Automated Reference Counting(ARC)の一部として、retain属性に代わるものです。ARC以外のコードでは、retainの同義語にすぎません。
これは、学ぶための良いウェブサイトですstrong
し、weak
iOSの5のために
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
弱い
weak
はstrong
、参照カウントを1増加させないことを除いて、オブジェクトの所有者にはならず、参照を保持するだけです。オブジェクトの参照カウントが0に下がった場合、ここでポイントしている場合でも、メモリから割り当てが解除されます。
上記のリンクには、弱いと強いに関する良い情報の両方が含まれています。
nonatomic
つまり、複数のスレッドによって同時にアクセスされるべきではありません。デフォルトatomic
では、スレッドセーフになります。
nonatomic
プロパティは、オブジェクトがスレッドセーフではないことを示します。つまり、別のスレッドがこのオブジェクトにアクセスしようとすると、問題が発生する可能性がありますが、これはアトミックプロパティよりもはるかに高速です。
strong
はARCで使用され、オブジェクトの保持カウントを気にする必要がないため、基本的にはが役立ちます。ARCは、処理が完了すると自動的に解放しstrong
ます。キーワードを使用すると、オブジェクトを所有していることになります。
weak
所有権とは、あなたがそれを所有しておらず、割り当てられたオブジェクトがとどまるまでオブジェクトを追跡し続けることを意味します。2番目のオブジェクトが解放されるとすぐに、それは価値を失います。たとえば obj.a=objectB;
が使用されており、プロパティが弱い場合、その値は、objectBがメモリに残るまで有効です。
strong,weak,retain,copy,assign
相互に排他的であるため、1つのオブジェクトでそれらを使用することはできません... 「宣言されたプロパティ」セクションをお読みください
これが少し役立つことを願っています...
nonatomic
除外が適用されないことを意味するだけです。アクセスがスレッドセーフではないという意味ではありません。それはatomic
vs nonatomic
がキャプチャしない実装の詳細です。
このリンクには内訳があります
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
assignは__unsafe_unretained所有権を意味します。
copyは、__ strong所有権、およびセッターでのコピーセマンティクスの通常の動作を意味します。
保持は__strong所有権を意味します。
強いは__strong所有権を意味します。
unsafe_unretainedは、__ unsafe_unretained所有権を意味します。
弱いとは、所有権が弱いことを意味します。
すばらしい答えです!より明確にしたいのはnonatomic
/ atomic
です。ユーザーは、このプロパティ-「原子性」が属性の参照にのみ広がり、その内容には及ばないことを理解する必要があります。つまりはatomic
/読書属性へのポインタとポインタのみを設定するためのユーザーの原子性を保証します。例えば:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
この場合、へのポインタがdict
異なるスレッドによってアトミックな方法で読み取られたり設定されたりすることが保証されています。しかし、dict
それ自体(ディクショナリがdict
指している)は依然としてスレッドセーフではありません。つまり、ディクショナリに対するすべての読み取り/追加操作は依然としてスレッドセーフではありません。
スレッドセーフなコレクションが必要な場合は、アーキテクチャが悪い(より頻繁に)か、実際の要件(よりまれに)のいずれかです。それが「実際の要件」である場合-優れたテスト済みのスレッドセーフコレクションコンポーネントを見つけるか、独自のものを作成するトライアルおよびトライボレーションの準備をする必要があります。後者のケースでは、「ロックフリー」、「ウェイトフリー」のパラダイムを取り上げます。一見ロケットサイエンスのように見えますが、「通常のロック」と比較して素晴らしいパフォーマンスを実現するのに役立ちます。