web-dev-qa-db-ja.com

Objective-Cは@プロパティ属性(nonatomic、copy、strong、weak)を宣言しました

宣言されたプロパティにnonatomiccopystrongweakなどの各属性を使用する必要がある場合、誰かが私に詳細に説明し、それぞれの機能を説明することはできますか?ある種の例もまたすばらしいでしょう。私はARCを使っています。

286
Gaurav_soni

この答えにはたくさんの間違いがあり、また古くなっています。他の質問/回答とコメントを見てください


非原子

nonatomicはマルチスレッドの目的で使用されます。宣言時にnonatomic属性を設定した場合は、そのオブジェクトにアクセスする必要がある他のスレッドがそれにアクセスして、マルチスレッドに関する結果を得ることができます。

コピー

オブジェクトが可変の場合、copyが必要です。現時点でオブジェクトの値が必要で、その値にそのオブジェクトの他の所有者による変更が反映されないようにするには、これを使用します。コピーを保持しているので、オブジェクトを使い終わったらオブジェクトを解放する必要があります。

代入

Assigncopyとは反対です。 assignプロパティの取得メソッドを呼び出すと、実際のデータへの参照が返されます。通常、この属性は、プリミティブ型(float、int、BOOL ...)のプロパティがあるときに使用します。

保持

属性がオブジェクトへのポインタである場合、retainが必要です。 @synthesizeによって生成されたセッターはオブジェクトを保持します(別名で保持カウントを追加します)。それが終わったら、あなたはオブジェクトを解放する必要があります。保持を使用すると、保持数が増え、自動解放プールのメモリが占​​有されます。

強い

strongは、Objective-Cの自動参照カウント(ARC)の一部として、retain属性に代わるものです。 ARC以外のコードでは、保持と同義語です。

これは、iOS 5のstrongweakについて学ぶのに良いウェブサイトです。 http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

弱い

weakstrongと似ていますが、参照カウントが1増加することはありません。それはそのオブジェクトの所有者にはならず、単にその参照を保持するだけです。オブジェクトの参照カウントが0になった場合でも、ここを参照している可能性がありますが、メモリから解放されます。

上記のリンクには、弱および強に関する良好な情報が含まれています。

555
iDhaval

nonatomicプロパティは、そのオブジェクトはスレッドセーフではないと述べています。つまり、別のスレッドがこのオブジェクトにアクセスしようとすると、悪いことが起こる可能性がありますが、アトミックプロパティよりはるかに高速です。

strongはARCと一緒に使用され、オブジェクトの保持数について心配する必要がないので基本的には役に立ちます。それが完了すると、ARCは自動的にそれを解放します。キーワードstrongを使用すると、そのオブジェクトを所有していることになります。

weakの所有権は、あなたがそれを所有していないことを意味し、それが割り当てられたオブジェクトが残るまでオブジェクトを追跡し続け、2番目のオブジェクトが解放されるとすぐにそれは価値がなくなります。例えば。 obj.a=objectB;が使用されていて、弱いプロパティがありますが、その値はobjectBがメモリに残るまで有効です。

copyプロパティはとてもよく ここで説明されています

strong,weak,retain,copy,assignは相互に排他的なので、単一のオブジェクトでそれらを使用することはできません... 「宣言されたプロパティ」 のセクションを読んでください

これがあなたを少し助けてくれることを願っています...

45

このリンクは故障しています

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

assignは__unsafe_unretained所有権を意味します。

copyは、セッターに対する通常のコピー・セマンティクスの振る舞いと同様に、__厳密な所有権を意味します。

保持は__強い所有権を意味します。

強いとは、__強い所有権を意味します。

unsafe_unretainedは__unsafe_unretainedの所有権を意味します。

弱いとは、所有権が弱いことを意味します。

17
Mick MacCallum

素晴らしい答え!私がより深く明確にしたいのは、nonatomic/atomicです。ユーザーは、この属性 - 「アトミック性」は属性の参照にのみ広がり、その内容には広がりません。すなわちatomicは、ポインターと属性へのポインターのみを読み取り/設定するためのユーザーアトミック性を保証します。例えば:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

この場合、dictへのポインターは、異なるスレッドによってアトミックな方法で読み取られる/設定されることが保証されます。しかしdict自体(それが指す辞書dict)は、依然としてスレッドセーフではありません。つまり、その辞書に対するすべてのread/add操作は依然としてスレッドセーフではありません。

もしあなたがスレッドセーフなコレクションを必要としているなら、あなたはどちらかの悪いアーキテクチャ(もっと頻繁に)OR本当の必要条件(もっとまれ)を持っています。それが「本当の必要条件」であるなら - あなたはどちらか良い&テストされたスレッドセーフなコレクションコンポーネントORを見つけるべきであるあなた自身のものを書く試練と試練のために準備される。後者の場合は、「ロックフリー」、「ウェイトフリー」のパラダイムを見てください。一見するとロケット科学のように見えますが、「通常のロック」と比較して素晴らしいパフォーマンスを達成するのに役立ちます。

9
DaddyM