2/05/2017

iOSアプリのライフサイクル

iOSアプリを開発する人は知っておくべき「iOSアプリケーションのライフサイクル」。

ユーザがアプリをクリックして起動したらどうなるだろうか? ホームスクリーンからアイコンをタップすることで、ViewControllerでどのようにコードが実行されるだろうか?

App Life Cycleがなんであるかを知ることが、なぜ有用なのか? あなたはどのようにツールがフードの下で働いているかを知れば、それをどのように使うのが一番いいかを決める判断を下すことができる!

例を挙げて説明すると、ボトルフリップを考えてみてほしい。

空中にボトルを投げて、正しく着地させることを期待する。しかし、ボトルフリップの背後にある物理学(角運動量と流体力学)を知っていれば、ボトルを投げる方法についての判断を下すことができ、どのくらいボトルの中に水が入っているかのような、結果に影響する細部が分かる。

どのようにApp Life Cycleに通じているか? フードの下で働くプロセスを知ることで、プログラミングやデバッグ中の細部に注意を向けることができる。それでは、ユーザがアプリのアイコンをクリックすると実際に何が起こるだろうか?

まず、Appleのドキュメントの冒頭文で始めよう:

アプリケーションは、開発者が独自に記述したコード部分と、システムフレームワークとが、うまく連携してその機能を発揮します。システムフレームワークが提供するのは、あらゆるアプリケーションが必要する基盤機能です。開発者はこれをカスタマイズし、アプリケーション固有の外観や挙動を与えるコードを記述することになります。効率的に開発を進めるためには、iOSの基盤機能やその動作原理を多少知っておくことが役立つでしょう。

XCodeでプロジェクトを作成する時、Appleはシステムフレームワークで動作するよう既にセットアップ済みのiOSアプリの基本コンポーネントを提供する。

しかし、それらのスタータープロジェクトは空白のキャンバスである。

あなたが望むアプリケーションにするためには、自身のビューとデータモデル、2つの相互作用を介してカスタマイズする必要がある。

しかし、ViewController内のコードが実行される前に、我々にとってかなりのセットアップが既に行われている。

Cベースのアプリの入り口点はmainと呼ばれる。言い換えれば、iOSアプリケーションで呼ばれる最初の関数がmain関数である。しかし、特にiOSアプリでは、この関数はプロジェクトに装備されており、我々は変更できない

我々がmain関数について知る必要があるのは、もう一つの関数UIApplicationMainを呼ぶことである。UIをロードし、制御を移したければそのように初期設定の制御を我々に移し、UIApplicationオブジェクトを通じてメイン実行ループを開始する。

UIApplicationオブジェクトはコードとAppleのシステムフレームワーク間の通信の処理に関与する。

UIApplicationオブジェクトは基本の内蔵アプリケーションである。しかしこの時点で、安全にコードをカスタマイズする方法はない。通信はアプリケーション上のデリゲート、つまりアプリデリゲートを通じて行われる。XCodeプロジェクトにはデフォルトでAppDelegateクラスが付属しているので、自分自身で作成について心配する必要はない。

アプリデリゲートは内蔵するアプリケーションオブジェクトの標準デリゲートで、初期化や状態遷移のようなアプリケーションレベルのイベントを処理するため、UIApplicationオブジェクトと一緒に働く。

アプリデリゲートは、ビューコントローラと同様にUIWindowオブジェクトを作成する。UIWindowはスクリーン上に一つ以上のビューの体裁の調整に関与する。

ほとんどのアプリはメイン画面上にコンテンツを表示するウィンドウが一つしかない。ビューコントローラはUIWindowオブジェクト内部でロードされる。

UIWindowオブジェクトはアプリの存続期間中存在する。もし、画面上のコンテンツを変更したい場合は、ビューコントローラを変更する - ウィンドウ自身を置き換えることはできない。ビューやビューコントローラにイベントを配送することで構成されている。

お分かりのように、我々はiOSアプリケーションの最初の足場をほとんど触れていない。我々が一貫してやりとりする部分はアプリデリゲートとビューコントローラのみである。アプリケーションレベルのイベントに反応するアプリデリゲートの中で呼ばれるapplication:didFinishLaunchingWithOptions(_:)のように呼ばれるデリゲートメソッドがあるため、アプリケーションのコンテキスト内のどこにいるかを知ることは重要である。

ビューコントローラの中で、viewDidLoad:viewWillAppear:のようなメソッドも下記に示すとおりビューライフサイクルから呼び出されるデリゲートメソッドである。

Ios app lifecycle

あなたがiOSアプリを開発しているなら、MVCデザインパターンに精通しているべきだ。そうでないなら、MVCはモデル(M)、ビュー(V)、コントローラ©の略である。簡単に言うと、データモデルとビューは決して直接通信してはならなず、むしろビューコントローラが デリゲートあるいはKVO(Key-Value Observing)のような通信パターンを介して通信を処理すべきである。もし精通していないなら、確実にそれを読み込むべきである。

興味深いことに、AppleのシステムフレームワークはMVCや実装のためのデリゲートに依存している。

Core objects 2x

そのイベントループで本当に何が実際に起きているのだろうか?

ユーザがデバイスとやりとりをすると、それらの相互作用に関連するイベントがシステムによって生成され、UIKitによって設定される特別なポートを介してアプリに配信される。

イベントは、アプリケーションによって内部でキューイングされ、実行のためのメイン実行ループに一つずつディスパッチされる(送り出される)。

UIApplicationオブジェクトはイベントを受診するための最初のオブジェクトで、何を行う必要があるかを決定する。

タッチイベントは普通、メインウィンドウオブジェクトにディスパッチされ、タッチが発生したビューにディスパッチに変える。ほとんどのイベントはアプリのメイン実行ループを使って配信される。

UIButtonsあるいはUISegmentedControllersで設定したIBActionはメイン実行ループを使って配信されないことを知っておくべきである。これらの制御のためのタッチイベントはターゲット-アクションを使って配信され、基本的にオブジェクトはイベントが発生した時に別のオブジェクトにメッセージを送るのに必要な情報を保持することを意味している。

ほとんどの有用なアプリデリゲートメソッドは実行状態変化に対応する。アプリが実行中に電話を受け取ると、アプリはバックグラウンドに移動し、実行状態変化が発生する。あなたはアプリにこれらの状態変化を対応するには、これらのデリゲートメソッドを使う必要がある。

この記事は役立つと思いますか? Twitterで他の人と共有するのにここをクリックして下さい!

Hacker News