Objective-Cで宣言された@property属性(非アトミック、コピー、ストロング、ウィーク)


289

:私は、各属性を使用しなければならないとき、誰かが詳細に私に説明することができnonatomiccopystrongweak、およびので、上の宣言されたプロパティのために、それぞれが何をするかを説明しますか?ある種の例も素晴らしいでしょう。ARCを使用しています。



rypress.com/tutorials/objective-c/propertiesこれですべてが説明されます
Deepak Thakur

回答:


559

この回答には多数のエラーがあり、古くなっています。他の質問/回答とコメントをご覧ください。


非原子

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

コピーする

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

割当

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

保持する

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

強い

strongObjective-C Automated Reference Counting(ARC)の一部として、retain属性に代わるものです。ARC以外のコードでは、retainの同義語にすぎません。

これは、学ぶための良いウェブサイトですstrongし、weakiOSの5のために http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

弱い

weakstrong、参照カウントを1増加させないことを除いて、オブジェクトの所有者にはならず、参照を保持するだけです。オブジェクトの参照カウントが0に下がった場合、ここでポイントしている場合でも、メモリから割り当てが解除されます。

上記のリンクには、弱いと強いに関する良い情報の両方が含まれています


1
このNSStringをそのクラス自体の内部で使用している場合は、プロパティを必要とせず、iVarにすることもできます。また、私が推奨する別のクラスで使用している場合は(強い、コピー)。
Ankit Srivastava

1
割り当てプロパティがありません。
mskw 2013

10
nonatomicつまり、複数のスレッドによって同時にアクセスされるべきではありません。デフォルトatomicでは、スレッドセーフになります。
wcochran 2015

1
これまでのところ、非原子の定義がまだ間違っており、原子に似ていることは少し不安です。過去5年間に何人がこれを使用し、間違った印象を得たのでしょうか。@wcochranの発言は正しかった。非アトミックは、ポインタへのアクセスがアトミックに処理されないため、スレッドセーフではないことを意味します。私が理解している非原子の利点は、軽量であることです。
John Bushnell

1
@JohnBus​​hnellのコメントに加えて、この回答には他にも多くのエラーや不正確な点があります。また、老朽化が進んでいないため、かなり歴史的です。この質問への回答を求める場合は、他の場所を調べてください。
CRD 2018年

45

nonatomic プロパティは、オブジェクトがスレッドセーフではないことを示します。つまり、別のスレッドがこのオブジェクトにアクセスしようとすると、問題が発生する可能性がありますが、これはアトミックプロパティよりもはるかに高速です。

strongはARCで使用され、オブジェクトの保持カウントを気にする必要がないため、基本的にはが役立ちます。ARCは、処理が完了すると自動的に解放しstrongます。キーワードを使用すると、オブジェクトを所有していることになります。

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

copyプロパティはここで非常によく説明されています

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

これが少し役立つことを願っています...


なぜ強い、弱い、保持、コピー、相互に排他的な割り当て
vinoth.kumar '16 / 10/15

nonatomic除外が適用されないことを意味するだけです。アクセスがスレッドセーフではないという意味ではありません。それはatomicvs nonatomicがキャプチャしない実装の詳細です。
bbum

@bbum除外しないこととスレッドセーフでないことの違いを説明できますか?
Ankit Srivastava

1
@AnkitSrivastavaの除外とは、スレッドAがスレッドBがコードパスをたどらないようにする場合です。そのコードパスが複数のスレッドからの実行に対して安全である場合、除外は必要ありません。 スレッドセーフでないということは、AとBが同時にダウンすると、コードパスが未定義の結果をもたらす可能性があることを意味します。つまり、除外を使用して何かをスレッドセーフにすることができますが、スレッドセーフは排他的(非並行)実行を必要としません。
bbum

17

このリンクには内訳があります

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

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

copyは、__ strong所有権、およびセッターでのコピーセマンティクスの通常の動作を意味します。

保持は__strong所有権を意味します。

強いは__strong所有権を意味します。

unsafe_unretainedは、__ unsafe_unretained所有権を意味します。

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


AssignプロパティはiVarと値にのみ使用されませんか?では、なぜそれが安全ではなく、なぜそれが保持されていないことに注意する必要があるのでしょうか?
mskw 2013

9

すばらしい答えです!より明確にしたいのはnonatomic/ atomicです。ユーザーは、このプロパティ-「原子性」が属性の参照にのみ広がり、その内容には及ばないことを理解する必要があります。つまりはatomic/読書属性へのポインタとポインタのみを設定するためのユーザーの原子性を保証します。例えば:

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

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

スレッドセーフなコレクションが必要な場合は、アーキテクチャが悪い(より頻繁に)か、実際の要件(よりまれに)のいずれかです。それが「実際の要件」である場合-優れたテスト済みのスレッドセーフコレクションコンポーネントを見つけるか、独自のものを作成するトライアルおよびトライボレーションの準備をする必要があります。後者のケースでは、「ロックフリー」、「ウェイトフリー」のパラダイムを取り上げます。一見ロケットサイエンスのように見えますが、「通常のロック」と比較して素晴らしいパフォーマンスを実現するのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.