私はインタビューでこの質問をされました。たとえば、UITableviewDelegate
プロトコルにはCellForRowAtIndexpath
があります。 protocol
クラスのメソッドではなく、UITableView
のデリゲートメソッドにして、直接呼び出すのはなぜですか?
プロトコルは、それらを実装するオブジェクトのタイプに関係なく、対話する一連のメソッドを定義するために使用されます。これにより、ビューが相互作用する外部リソースを簡単に交換し、コードの全体的な結合を減らすことができます。これは、そのタイプの知識を持つリソースを直接呼び出すのとは対照的です。
-[tableView:cellForRowAtIndexPath:]をUITableViewControllerクラスに配置しないことで、データソースとして使用する別のクラスを作成できます(cellForRowはデータソースにあります)。これは、コードの編成やコードの再利用に役立ちます。
プロトコルに入れることで、クラスは任意のスーパークラスを持つことができます。独自のデータソースまたはデリゲートをサブクラス化するときに役立ちます。また、アプリデリゲートまたはビューサブクラス(これを行わないでください)を含め、必要な場所にデータソースを追加することもできます。
委任
委任は、Hostオブジェクトが別のオブジェクト(そのデリゲート)への弱い参照(単純なポインター参照であり、保持されないという意味で弱い)を埋め込み、タスクへの入力が必要なときに定期的にデリゲートにメッセージを送信するメカニズムです。 Hostオブジェクトは通常、何かを達成しようとしている「既成の」フレームワークオブジェクト(NSWindowやNSXMLParserオブジェクトなど)ですが、一般的な方法でしか実行できません。 ほとんどの場合カスタムクラスのインスタンスであるデリゲートは、Hostオブジェクトと連携して動作し、タスクの特定のポイントでプログラム固有の動作を提供します。 したがって、この委任により、サブクラス化を必要とせずに、別のオブジェクトの動作を変更または拡張することができます。
したがって、この場合は、カスタムビルドのセルを提供する必要がありますが、そうするためにUITableViewをサブクラス化する必要はありません。プロトコルに準拠するクラスであれば、カスタムセルを提供できます。