AppDelegateとは何ですか?それをいつ使用するかを知るにはどうすればよいですか?


146

iPhoneアプリの開発を始めたばかりです。AppDelegateとカスタムクラスのどちらにデータを配置する必要があるかを知るにはどうすればよいですか?AppDelegateのようなパターンを使用するPythonやPHPのような別のプログラミング言語に類似したルールやタイプはありますか?

回答:


255

Andrewが「アプリケーションの中心」という用語を使用することで暗示される設計アプローチは、通常は避けます。つまり、中心的な場所にあまりにも多くのものを集中させないようにすべきだと思います。優れたプログラム設計では、通常、「関心領域」によって機能を分離する必要があります。

デリゲートオブジェクトは、接続先のオブジェクトが特定のイベントまたは状態に達したときに通知を受けるオブジェクトです。この場合、アプリケーションデリゲートは、UIApplicationオブジェクトが特定の状態に達したときに通知を受け取るオブジェクトです。多くの点で、これは特別な1対1のオブザーバーパターンです。

これは、AppDelegateの「関心領域」が特別なUIApplication状態を処理していることを意味します。これらのうち最も重要なものは次のとおりです。

  • applicationDidFinishLaunching:-起動時の構成と構築の処理に適しています
  • applicationWillTerminate:-最後にクリーンアップするのに適しています

他の機能は実際にはAppDelegateに属していないため、AppDelegateには配置しないでください。このような他の機能には、次のものがあります。

  • ドキュメントデータ-ドキュメントマネージャーシングルトン(複数のドキュメントアプリケーションの場合)またはドキュメントシングルトン(単一のドキュメントアプリケーションの場合)が必要です
  • ボタン/テーブル/ビューコントローラー、ビューデリゲートメソッド、またはその他のビューの処理(applicationDidFinishLaunching:のトップレベルビューの構築を除く)-この作業は、それぞれのビューコントローラークラスで行う必要があります。

多くの人々は、これらが怠惰であるか、AppDelegateがプログラム全体を制御していると考えているため、これらをAppDelegateにまとめます。AppDelegateはアプリの懸念事項を混乱させ、スケーリングしないため、AppDelegateでの集中化は避けてください。


8
+1これは素晴らしい答えです。サブビューにappDelegate doを呼び出して別のサブビューに切り替えるようにビューコントローラーに指示するサンプルコードを見ていて、コードの匂いのように感じました。私の鼻がまだ機能していることを知ってよかった。
アラン

2
オンラインチュートリアルで次のようなものが表示されることがあります。AppDelegate * del = [AppDelegate sharedAppDelegate]; (developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…を参照)それはどういう意味ですか?私はそれを使用した例を見ることができますが、その背後にある理論を本当に理解していません(この例を参照してください:developer.apple.com/library/ios/#samplecode/…
abbood

27

アプリケーションデリゲートは、アプリケーションの中心です。それは事実上あなたの「プログラムコントローラー」です。

アプリケーションデリゲートは、他のビューの作成を開始するために最も一般的に使用されるapplicationDidFinishLaunchingメッセージを含む、アプリケーションレベルのメッセージを受信するクラスです。

厳密には似ていませんが、Cocoaプログラムの「main()」ルーチンと考えることができます。


AppDelegateにすべてのUIコントローラーを配置するのは、そのためのカスタムクラスをすべて作成するよりも簡単なので、+ 1を与えます。
2013年

3
@rwolsは注意が必要です。懸念事項を分離すると、コードがよりクリーンになり、デバッグの手間が減ります。時間をかけてそれらのカスタムクラスを作成し、すべてのオブザーバーを1つのファイルに配置しないでください。
wheeliez 2015年

2

@Shivam、ありがとう。

私が理解していることから、Android appDelegateにあるものに近いApplicationです。はviewDidLoadviewDidDisappearAndroidのライフサイクルに相当します。すべてのアプリケーションには、起動から着信からの割り込み、通知の表示まで、ライフサイクルがあります。これらのsystemイベントが発生したときにコードで何か特別なことを行う必要がある場合は、メソッドをコードで記述する必要があります。

Android onPauseではonDestroyonCreateこのようなシステムイベントを処理するために、コールバックメソッドを使用しています。


onPauseonCreateおよびonDestroyAndroidの方法は、より類似しているviewDidDisappearviewDidLoadiOSのビューコントローラのライフサイクルの方法。比較しなければならないのであればApplication、Android のクラスAppDelegateはiOS のクラスに近いと思います。
Shivam Bhalla 2017

よろしくお願いします。私の答えを改善できる場合は、実行してください。私はあなたの答えを読んだ後で私の答えを削除します。
Siddharth 2017

1

これがもう少し役立つことを願っています...

この言語を初めて使用するプログラマーは常に同じ質問をします-プログラムはメインメソッドから始まりますか?はい、あなたはこの場合正しいです。iOSアプリもメインメソッドから開始します。
あなたのメインクラスは以下の関数を呼び出します:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMainは、UIApplicationオブジェクトを作成するCocoa Touch実行ループとアプリインフラストラクチャを開始します。アプリケーションにはコンテンツが必要なので、objective-cはデリゲートを使用してこれを処理します。これがAppDelegate(のデリゲートとして機能UIApplication)と呼ぶ理由です。そのデリゲートのオプションのメソッドのいくつかを実装し、それに応じて動作します。


上記の答えの誤りを誰かに理解させてください
Anurag Bhakuni

2
a)適切な句読点/スペル/文法を使用していない、b)元の投稿者が尋ねた質問に実際には答えていないため、トピックから外れているため、混乱しているようです。
ケイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.