ARC(Automatic Reference Counting)ではいくつかの新しい型修飾子が導入されています。私は__strong
と__weak
を見たことがありますが、彼らは何をしていますか?ARCで導入された新しいタイプ修飾子は何ですか?
答えて
__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を参照してください。
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を使用する必要があります。これは、使用した割り当てとまったく同じように動作します。
Mac OS Xでは、「弱い」はLion以降のみ利用可能です。あなたのiOS 4.2のアドバイスは、Snow Leopardにも当てはまります。 –
@NJones、私は質問があります。どのように地球上で「弱い」のは「非原子的」なのだろうか? 'weak' *は定義上*は' atomic'です。 –
@JacobRelkin。それは良い質問です。私はnonatomicが弱い修飾語によって嘘をついていると思います。しかし、それはどのように行われているのですか。ちょうど私が新しいXcodeプロジェクトを開始したことを確認し、ラベルを追加してから、コンセントを接続して、 '@property(弱い、非原子的な)IBOutlet UILabel *ラベル;'をくれました。 – NJones
タイプ修飾子は、__autoreleasing
,__strong
,__unsafe_unretained
および__weak
です。プロパティー修飾子は、strong
,unsafe_unretained
およびweak
です。
LLVM/Clangのドキュメントでsection 4 of Automatic Reference Countingをご覧ください。
- 1. Cの修飾子と修飾子の違いは何ですか?
- 2. ARC所有者修飾子の位置は重要ですか?
- 3. タイプ指定子を持たないタイプ修飾子
- 4. 関数の静的な新しい修飾子のポイントは何ですか?
- 5. printfの長さ修飾子フラグのポイントは何ですか?
- 6. タイプと生涯修飾子の違い
- 7. 「外部」アクセス修飾子がない理由は何ですか?
- 8. .aspxページで作成されたコントロールの既定のアクセス修飾子は何ですか。プライベートか他の何か?
- 9. Kotlinで密封された修飾語は何を表していますか?
- 10. python - ネストされたクラスアクセス修飾子
- 11. UML修飾子の目的は何ですか?
- 12. 匿名クラスのコンストラクタのアクセス修飾子とは何ですか?
- 13. Typescriptのクラスのパブリックアクセス修飾子の目的は何ですか?
- 14. OSGIのバージョン修飾子とは何ですか?
- 15. スカラーアクセス修飾子の保証は何ですか?
- 16. VB6のプロパティのデフォルトアクセス修飾子は何ですか?
- 17. 新しい修飾子でベースクラスのパブリックメソッドを隠す
- 18. VueJsが.nativeイベント修飾子を導入するのはなぜですか?これのユースケースは何ですか? - Vue.js
- 19. ARC内のIBOutletと有効期限修飾子
- 20. 修飾された修飾されたポインタを関数に渡すことはできますか?
- 21. regexpのo修飾子は何を意味しますか?
- 22. Dartの最後の修飾子は何をしますか?
- 23. パッケージ修飾子は、パッケージ修飾子でトップレベルのクラスを定義するとき
- 24. メソッドは保護されていますが、リフレクションによってメソッドの修飾子を取得しました。修飾子はpublicです。 IDEは、Android Studioの
- 25. 最新の作成された列修飾子を取得します
- 26. Javaでオーバーライドされたメソッドのアクセス修飾子を変更しますか?
- 27. アクセス修飾子
- 28. 修飾子
- 29. セッション修飾子
- 30. プロパティ修飾子
'unsafe__unretain'オブジェクトをどのように安全にしますか?つまり、コンパイラによって自動的に 'nil'になっていなければ、そのダングリングオブジェクトをどのように扱うべきでしょうか? –
@MohammadAbdurraafayその場合には '__weak'を使うことができます... –
私が間違っていないのなら、' __weak'は後のiOSバージョンでは利用できません。その場合、 'unsafe__unretain'オブジェクトをどのようにして安全にするのでしょうか。自動的に 'nil'に設定されていませんか? –