1. ホーム
  2. objective-c

[解決済み] ARC - __unsafe_unretainedの意味?

2023-06-25 03:36:32

質問

正しいかどうか確認したいのですが。

  1. 必要なのは __unsafe_unretain オブジェクトを作成する必要がありますか?
  2. もしオブジェクトが __unsafe_unretained を使う必要があるのでしょうか? assign の中に @property ? は、オブジェクトを保持せず、私が割り当てたオブジェクトを参照するだけということでしょうか?
  3. デリゲート以外では、どのような時に使いたいですか?
  4. ARCのことなのか、以前から使われていたのか?

どのように解決するのですか?

LLVMコンパイラー3.0では、新たに4つの所有権修飾子が導入されました。 __strong , __autoreleasing , __unsafe_unretained そして __weak . 最初の3つはARCの外でも利用可能です。 という仕様で .

Joshuaが示すように、デフォルトでは全てのポインタは暗黙の了解で __strong の下にあります。 これは、オブジェクトがそのポインタに割り当てられると、そのポインタがそれを参照する限り保持されることを意味します。これはほとんどのものにとって良いことですが、私の回答で説明したように、retainサイクルの可能性が出てきてしまいます。 ここで . たとえば、インスタンス変数として別のオブジェクトを含むオブジェクトがあり、その2番目のオブジェクトがそのデリゲートとして最初のオブジェクトに戻る強力なリンクを持っている場合、2つのオブジェクトは決して解放されません。

このような理由から __unsafe_unretained__weak という修飾子が存在します。最も一般的な使い方はデリゲートで、そのデリゲートに対してプロパティを定義するために weak または unsafe_unretained 属性 ( assign は事実上 unsafe_unretained を意味します)、そして、それぞれのインスタンス変数に __weak または __unsafe_unretained . これは、デリゲートインスタンス変数がまだ最初のオブジェクトを指していることを意味しますが、そのオブジェクトが保持されないので、保持サイクルを中断し、両方のオブジェクトを解放することができます。

これは、デリゲート以外にも、コード内で形成されるかもしれない他のretainサイクルを壊すのに便利です。役に立つことに、Leaks ツールには Cycles ビューがあり、アプリケーションで検出された retain サイクルをグラフィカルに表示します。

両方とも __unsafe_unretained__weak はオブジェクトの保持を防止しますが、その方法は若干異なります。 例えば __weak に対して、オブジェクトへのポインタは変換され nil に変換され、非常に安全な動作となります。その名の通り __unsafe_unretained は、オブジェクトが割り当て解除された後でも、そのオブジェクトがあったメモリを指し続けます。これは、その割り当て解除されたオブジェクトにアクセスすることによるクラッシュにつながる可能性があります。

なぜ今まで __unsafe_unretained を使うのでしょうか?残念ながら __weak はデプロイメント ターゲットとして iOS 5.0 と Lion に対してのみサポートされています。iOS 4.0 と Snow Leopard にターゲットを戻したい場合は、デプロイメント ターゲットとして __unsafe_unretained 修飾子を使用するか、Mike Ash の MAZeroingWeakRef .