私はそれが正しいことを確認したいだけです:
__unsafe_unretain
オブジェクトは必要ですか?__unsafe_unretained
の場合、@property
でassign
を使用する必要がありますか?これは、オブジェクトが保持されず、単に割り当てられたオブジェクトを参照することを意味しますか?LLVMコンパイラ3.0では、__strong
、__autoreleasing
、__unsafe_unretained
、および__weak
の4つの新しい所有者修飾子が導入されています。最初の3つは、ARC以外でも 仕様 に従って利用可能です。
Joshuaが示すように、デフォルトでは、すべてのポインターはARCの下で__strong
であると暗示されています。つまり、オブジェクトがそのポインターに割り当てられると、そのポインターがそれを参照している限り保持されます。ほとんどの場合これで問題ありませんが、答え here で説明しているように、保持サイクルの可能性が広がります。たとえば、インスタンス変数として別のオブジェクトを含むオブジェクトがあり、その2番目のオブジェクトがデリゲートとして最初のオブジェクトに戻る強力なリンクを持っている場合、2つのオブジェクトは解放されません。
__unsafe_unretained
および__weak
修飾子が存在するのはこのためです。それらの最も一般的な用途はデリゲートであり、weak
またはunsafe_unretained
属性(assign
は実質的にunsafe_unretained
)でそのデリゲートのプロパティを定義します。次に、それぞれのインスタンス変数に__weak
または__unsafe_unretained
のマークを付けて一致させます。つまり、デリゲートインスタンス変数は最初のオブジェクトを指し示しますが、そのオブジェクトが保持されることはないため、保持サイクルが中断され、両方のオブジェクトが解放されます。
デリゲートを超えて、これはあなたのコードで形成されるかもしれない他の保持サイクルを壊すのに役立ちます。リークスインストゥルメントにはサイクルビューが含まれており、アプリケーションで検出された保持サイクルがグラフィカルに表示されます。
__unsafe_unretained
と__weak
の両方は、オブジェクトの保持を防ぎますが、わずかに異なる方法で。 __weak
の場合、オブジェクトへのポインターは、それが指すオブジェクトの割り当て解除時にnil
に変換されます。これは非常に安全な動作です。その名前が示すように、__unsafe_unretained
は、オブジェクトが割り当て解除された後でも、オブジェクトが存在したメモリをポイントし続けます。これにより、その割り当て解除されたオブジェクトへのアクセスが原因でクラッシュする可能性があります。
なぜ__unsafe_unretained
を使用するのですか?残念ながら、__weak
は、デプロイメントターゲットとしてiOS 5.0とLionでのみサポートされています。 iOS 4.0とSnow Leopardをターゲットに戻す場合は、__unsafe_unretained
修飾子を使用するか、Mike Ashの MAZeroingWeakRef のようなものを使用する必要があります。
weak
を使用することもできます。unsafe_unretained
を使用することもできます。unsafe_unretained
アイテムはweak
に似ていますが、ポイントするアイテムが解放されたとき(およびそれに伴うオーバーヘッド)をクリアする追加の安全性はありません。__unsafe_unretained
は、ARCの前のオブジェクトのデフォルトストレージと同じです。 ARCでは、デフォルトは__strong
は、参照が範囲外になるまで、その参照を持っていることを意味します。
__unsafe_unretainedに関する別の観察:デバイス上のアプリでクラッシュが発生し、iVarsが__unsafe_unretainedとして宣言されているシミュレーターで[〜#〜] not [〜#〜]が発生しました。はい、ARC移行からのコードのバグでしたが、デバイスとシミュレーターのこのような違いに気付いたのは初めてでした。