2009-05-06 3 views
14

私はApp Delegateが何をしているのか知っていると思います。アプリの起動が完了すると呼び出される-applicationDidFinishLaunchingのような素晴らしいメソッドがいくつかあります。しかし、実際それは何ですか?そのオブジェクトはUIApplicationMain関数でインスタンス化されていますか?アプリケーションデリゲートについては何がベストですか?それは全体のコンセプトにどのように適合していますか?

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

答えて

34

を楽しめ、デリゲートは、他の目的は、行動の問題にまで延期オブジェクトであり、その状態の変化について知らせる。たとえば、UITableViewDelegateは、選択が行われたときや行が並べ替えられたときにUITableViewがどのように動作するかについての質問に答える責任があります。 UITableViewは、特定の行の高さを知りたいときに、UITableViewが要求するオブジェクトです。モデルビューコントローラのパラダイムでは、デリゲートはコントローラであり、多くのデリゲートの名前は「コントローラ」で終わります。

UIApplicationDelegateは明らかに明示される危険がありますが、UIApplicationの代理人です。 NSApplicationのデリゲートがNSApplicationの動作をより直接的に制御できるため(アプリケーションが終了するのを防ぐなど)、Cocoa(Mac)ではCocoa Touch(iPhone)よりも関係が少し明確になります。 iPhoneはUIApplicationを制御することはほとんどできないため、UIApplicationDelegateは主にアクティブな意思決定プロセスではなく、変更を通知されます。

UIApplicationDelegateは、アプリのどこからでも厳密には入手できません。シングルトンUIApplicationは([UIApplication sharedApplication])であり、それを介してそのデリゲートを見つけることができます。しかし、これは、アプリ内のすべてのオブジェクトがアプリデリゲートと直接話すことが適切であるという意味ではありません。一般的に、私は、開発者が、アプリケーションの代理人にランダムなオブジェクトを伝えるのをやめさせることをお勧めします。このように解決されたほとんどの問題は、Singletons、NSNotification、または他の代理オブジェクトを使って解決できます。

Macの作成に関しては、アプリケーションデリゲートについて魔法はありません。ほとんどの場合、NIBによってインスタンス化され、配線されたオブジェクトです。しかし、iPhone上では、UIApplicationMain()によってインスタンス化された場合、アプリデリゲートはやや魔法になります。 4番目のパラメータは、アプリケーションデリゲートのクラスを示すNSStringであり、UIApplicationMain()はそれを作成してsharedApplicationのデリゲートとして設定します。これにより、NIBなしでデリゲートを設定することができます(Macでは非常に困難です)。 UIApplicationMain()の4番目のパラメータがnil(Appleテンプレートのように)である場合、デリゲートはメインウィンドウと同様にメインNIBによって作成され、配線されます。

+1

洞察のおかげで、ロブ!あなたがトップのリンゴエンジニアではないことは確かですか? ;) – Thanks

3

オブジェクトはこのようにインスタンス化されます。

メイン関数は、info.plistのメイン・ペン・セットを探します。 nibには、UIApplicationDelegatesとその必要なメソッドを実装する必要のあるクラスに設定された、アプリケーションとしてのデリゲートがあります。次に、アプリケーションデリゲートはいくつかのviewcontrollerをロードします。

それはココアでなど、そのような低メモリなどのアプリケーション全体に影響を与えるイベントのためのアプリケーション広いコールバックオブジェクトとして