Cocoaでは、デリゲートは、別のオブジェクトが動作の質問を延期し、その状態の変化について通知するオブジェクトです。たとえば、UITableViewDelegateは、選択が行われたとき、または行が並べ替えられたときにUITableViewがどのように動作するかについての質問に答える責任があります。これは、UITableViewが特定の行の高さを知りたいときに尋ねるオブジェクトです。Model-View-Controllerパラダイムでは、デリゲートはコントローラーであり、多くのデリゲートの名前は「コントローラー」で終わります。
明らかなことを述べるリスクがありますが、UIApplicationDelegateはUIApplicationのデリゲートです。NSApplicationデリゲートはNSApplicationの動作をより直接的に制御できるため(たとえば、アプリケーションが終了しないようにするため)、Cocoa Touch(iPhone)よりもCocoa(Mac)の方が関係が少し明確になります。iPhoneではUIApplicationをあまり制御できないため、ほとんどの場合、UIApplicationDelegateには、アクティブな意思決定プロセスではなく、変更が通知されます。
UIApplicationDelegateは、アプリのどこからでも厳密に利用できるわけではありません。シングルトンUIApplicationは([UIApplication sharedApplication])であり、それを介してそのデリゲートを見つけることができます。ただし、これは、アプリ内のすべてのオブジェクトがアプリデリゲートと直接通信することが適切であることを意味するものではありません。一般的に、私は開発者がランダムなオブジェクトにアプリのデリゲートと話をさせることを思いとどまらせます。その方法で解決されるほとんどの問題は、シングルトン、NSNotification、またはその他のデリゲートオブジェクトを介してより適切に解決されます。
その作成に関しては、Macではアプリデリゲートについて魔法のようなものは何もありません。ほとんどの場合、これはNIBによってインスタンス化および配線されたオブジェクトにすぎません。ただし、iPhoneでは、UIApplicationMain()によってインスタンス化された場合、アプリデリゲートは少し魔法のようになります。4番目のパラメーターはアプリデリゲートのクラスを示すNSStringであり、UIApplicationMain()がそれを作成し、sharedApplicationのデリゲートとして設定します。これにより、NIBなしでデリゲートを設定できます(Macでは非常に難しいことです)。UIApplicationMain()の4番目のパラメーターがnilの場合(Appleテンプレートの場合と同様)、デリゲートはメインウィンドウと同様にメインNIBによって作成および配線されます。