1. ホーム
  2. objective-c

[解決済み] Objective-Cのデリゲートには通常、retainではなくassignというプロパティが与えられるのはなぜですか?

2022-05-03 05:36:55

質問

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で処分されるので、なくなることを心配する必要はありません。