2011-10-31 16 views

答えて

32

__strongは、代入時に、式の右辺値が保持され、プリミティブセマンティクスを使用して左辺値に格納されることを意味します。 (以前に参照されたオブジェクトがリリースされます、あなたがしなければならないすべてはnilを割り当てている、そのようなオブジェクトの割り当てを解除するには、nilが効果的に何もしませんし、それは桃とクリームだこれ、保持されます。)

__unsafe_unretained__weakはに似ています右辺値のアドレスが左辺値に割り当てられるという意味ですが、__weak修飾子を使用すると、この操作はアトミックであり、いくつかの異なるセマンティクスの影響を受けます。これらのうちの1つは、割り当て中のオブジェクトが現在割り当て解除中である場合、割り当てはnilと評価され、その値はアトミックに式の左辺値に戻されます。したがって、その操作は実際には安全ではなく、維持されていないため、__unsafe_unretainedとなります。

のようなものです。ただし、保持されているオブジェクトは現在の自動解放プールにプッシュされるため、オブジェクトの一時所有権を取得してコレクションから削除し、呼び出し元に戻すことができます。これには他の用途もありますが、主にオブジェクトの一時的な所有権を取得することと関係しています。

これらの動作は、対応するプロパティ修飾子(strong,unsafe_unretainedおよびweak)にも存在します。あなたの代わりに使用することができ弱参照をゼロにiOSの5、したがって、__weakの恩恵を享受することができない、Mike Ash wrote a superb article(および実装)を標的ない人のために:

Clang Automatic Reference Counting Technical Specification

EDITを参照してください。

+0

'unsafe__unretain'オブジェクトをどのように安全にしますか?つまり、コンパイラによって自動的に 'nil'になっていなければ、そのダングリングオブジェクトをどのように扱うべきでしょうか? –

+0

@MohammadAbdurraafayその場合には '__weak'を使うことができます... –

+0

私が間違っていないのなら、' __weak'は後のiOSバージョンでは利用できません。その場合、 'unsafe__unretain'オブジェクトをどのようにして安全にするのでしょうか。自動的に 'nil'に設定されていませんか? –

4

Strongは、プロパティを保持するためにARCに指示します。

@property (strong,nonatomic) NSObject *object; 
@property (retain,nonatomic) NSObject *object; 

弱いのは基本的に未保持のプロパティです。オブジェクトの割り当てが解除された場合を除いて、ウィークポインタは自動的にnilに設定されます。

@property (weak,nonatomic) NSObject *object; 
@property (assign,nonatomic) NSObject *object; 

弱いのは、iOS 4.3以降でのみ利用可能です。 iOS 4.2をターゲットにしたい場合は、unsafe_unretainedを使用する必要があります。これは、使用した割り当てとまったく同じように動作します。

+0

Mac OS Xでは、「弱い」はLion以降のみ利用可能です。あなたのiOS 4.2のアドバイスは、Snow Leopardにも当てはまります。 –

+0

@NJones、私は質問があります。どのように地球上で「弱い」のは「非原子的」なのだろうか? 'weak' *は定義上*は' atomic'です。 –

+0

@JacobRelkin。それは良い質問です。私はnonatomicが弱い修飾語によって嘘をついていると思います。しかし、それはどのように行われているのですか。ちょうど私が新しいXcodeプロジェクトを開始したことを確認し、ラベルを追加してから、コンセントを接続して、 '@property(弱い、非原子的な)IBOutlet UILabel *ラベル;'をくれました。 – NJones

1

タイプ修飾子は、__autoreleasing,__strong,__unsafe_unretainedおよび__weakです。プロパティー修飾子は、strong,unsafe_unretainedおよびweakです。

LLVM/Clangのドキュメントでsection 4 of Automatic Reference Countingをご覧ください。

関連する問題