[解決済み] ARC - __unsafe_unretainedの意味?
質問
正しいかどうか確認したいのですが。
-
必要なのは
__unsafe_unretain
オブジェクトを作成する必要がありますか? -
もしオブジェクトが
__unsafe_unretained
を使う必要があるのでしょうか?assign
の中に@property
? は、オブジェクトを保持せず、私が割り当てたオブジェクトを参照するだけということでしょうか? - デリゲート以外では、どのような時に使いたいですか?
- 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
.
関連
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み】Objective-Cの自動参照カウントでは、どのようなリークを防いだり最小化したりできないのですか?
-
[解決済み】ARCで@autoreleasepoolがまだ必要なのはなぜですか?
-
[解決済み] Objective-Cのデリゲートには通常、retainではなくassignというプロパティが与えられるのはなぜですか?
-
[解決済み] ARCおよびブリッジドキャスト
-
[解決済み] ARCで__autoreleasing ownership修飾子を記述する必要があるのは、どのような場合ですか?
-
[解決済み] iOSのBackground Threadの起動
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Objective-Cの自動参照カウントでは、どのようなリークを防いだり最小化したりできないのですか?
-
[解決済み] Objective-Cで配列に結合する
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] 2つの日付の差を計算するにはどうすればよいですか?
-
[解決済み] ベストプラクティス - 自分のプロジェクト/アプリのためのNSErrorドメインとコード
-
[解決済み] NSDictionaryにboolean値を追加するにはどうすればよいですか?
-
[解決済み] Xcodeがシステムキーチェーンを使用するためにパスワードを要求し続ける
-
[解決済み] NSSetからNSMutableArrayを返す方法
-
[解決済み] IOS: 角の丸いUIImageまたはUIImageViewを作成する
-
[解決済み] UIButtonのテキストを変更する