16

AppDelegateが何をするのか知っていると思います。-applicationDidFinishLaunchingアプリの起動が終了したときに呼び出されるような、いくつかの優れたメソッドがあります。しかし、それは実際には何ですか?関数でインスタンス化されたオブジェクトはありUIApplicationMainますか?

また、アプリ内のすべてのクラスがそのApp Delegateオブジェクトにアクセスできるようにするにはどうすればよいですか?これらの関係を視覚化する良いグラフがネット上にありますか?

4

2 に答える 2

37

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によって作成および配線されます。

于 2009-05-06T13:35:10.313 に答える
3

オブジェクトはこの方法でインスタンス化されます。

main関数は、info.plistで設定されたメインペン先を検索します。nibには、UIApplicationDelegatesとその必要なメソッドを実装する必要があるクラスに設定されたアプリデリゲートがあります。次に、アプリデリゲートはいくつかのビューコントローラをロードします。

これは、メモリ不足など、アプリケーション全体に影響を与えるイベントのアプリケーション全体のコールバックオブジェクトとして機能します。

于 2009-05-06T12:19:27.687 に答える