[解決済み] Objective-Cのデリゲートには通常、retainではなくassignというプロパティが与えられるのはなぜですか?
質問
Scott Stevensonによって維持されている素晴らしいブログをサーフィンしているのですが、デリゲートの割り当てに関するObjective-Cの基本的な概念である「assign」プロパティと「retain」を理解しようとしているのです。ガベージコレクション環境ではどちらも同じであることに注意してください。私は主に非GCベースの環境(例:iPhone)について懸念しています。
Scottのブログから直接引用しました。
assign キーワードは、インスタンス変数に値をコピーまたは保持するのではなく、直接代入するセッターを生成します。これは、NSInteger や CGFloat のようなプリミティブな型や、デリゲートなどの直接所有しないオブジェクトに最適です(")。
デリゲートオブジェクトを直接所有しないとはどういうことですか?私は通常、デリゲートを保持します。なぜなら、デリゲートが奈落の底に消えてしまわないように、retainがその面倒をみてくれるからです。UITableViewControllerをdataSourceやdelegateから抽象化することもある。また、そのオブジェクトをretainする。UITableViewが常にデリゲートを持っているように、このオブジェクトが決してなくならないようにしたいのだ。
Objective-C 2.0プログラミングでよくある、retainの代わりにassignプロパティをデリゲートに使うというパラダイムを理解するために、私がどこで、なぜ間違っているのか、誰かもっと説明してくれませんか?
ありがとうございます。
解決方法は?
デリゲートの保持を避ける理由は、保持サイクルを回避する必要があるからです。
AがBを作成する Aは自分自身をBのデリゲートとして設定する ... Aは所有者によって解放される
もしBがAを保持していた場合、BがAを所有しているためAは解放されず、したがってAのdeallocは呼ばれない。 AとBの両方 をリークします。
AはBを所有しているため、deallocで処分されるので、なくなることを心配する必要はありません。
関連
-
[解決済み] イニシャライザーの要素がコンパイル時定数でない
-
[解決済み] クラス 'test_coredataAppDelegate' の重複したインターフェイス宣言
-
[解決済み] 開発者の身元が確認できないため開けない
-
[解決済み] クラス vs. #インポート
-
[解決済み] クラスメソッドとインスタンスメソッドの違いは何ですか?
-
[解決済み] デリゲートとイベントの違いは何ですか?
-
[解決済み】Objective-C ARC: strong vs retainとweak vs assign
-
[解決済み】Objective-CのMethod Swizzlingの危険性とは?
-
[解決済み】Objective-Cでクラスレベルのプロパティを宣言するにはどうすればいいですか?
-
[解決済み] [Objective-Cの@propertyのretain, assign, copy, nonatomicについて。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラー: バイナリ式のオペランドが無効です ('float' と 'float')
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cは構造体の使用を禁じていますか?
-
[解決済み] NSStringをNSNumberに変換する方法
-
[解決済み] Objective-Cで抽象クラスを作成する
-
[解決済み] Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?
-
[解決済み] objective-c/cocoaで例外を投げる
-
[解決済み] ブロック内の変数をブロック外の変数に代入する
-
[解決済み】Objective-Cでクラスレベルのプロパティを宣言するにはどうすればいいですか?
-
[解決済み】Objective-Cでオブジェクトがどのクラスであるかをテストするにはどうすればよいですか?