|
|
Log In | Not a Member? |
Contact ADC |
| < Previous PageNext Page > |
Objective-Cのクラス群とそれらのメソッド群で構成されるフレームワークの使い方は、Cの関数ライブラリの使い方とは異なります。後者の場合は、作成するプログラムに応じて、どの関数をいつ使用するかをほぼ自由に選択できます。一方、フレームワークでは、プログラム、あるいは少なくとも、プログラムが対処しようとしている特定の問題領域に対して特定のデザインに従うことが求められます。手続き型プログラムでは、必要に応じて関数ライブラリを呼び出し、プログラムの処理を済ませることができます。オブジェクト指向フレームワークを使用する場合も、プログラムの作業の大半を実行するためには、フレームワークのメソッドを呼び出す必要があるという点では同様です。しかし、フレームワークをカスタマイズし、ニーズに合わせて改良を加えることも必要になります。そのためには、フレームワークから適宜呼び出されるメソッドを実装します。これらのメソッドは、作成したコードをフレームワークによって課せられる構造に組み込むための“フック”であり、プログラムを特徴付ける動作によってフレームワークを強化します。ある意味で、プログラムとライブラリの通常の役割が逆転します。ライブラリコードを自分のプログラムに組み込むのではなく、自分のプログラムコードをフレームワークに組み込むのです。
カスタムコードとフレームワークとの関係について理解を深めるために、Cocoaプログラムが実行を開始すると何が起きるかを検討しましょう。
Objective-Cプログラムは、Cプログラムの実行開始場所であるmain 関数の中で実行が開始されます。複雑なObjective-Cプログラムでも、mainの役割はいたってシンプルであり、次の2つのステップで構成されます。
オブジェクトのコアグループを準備する。
プログラムの制御をそれらのオブジェクトに渡す。
プログラムの実行中、コアグループ内のオブジェクトによってほかのオブジェクトが作成されたり、作成されたオブジェクトによってさらに別のオブジェクトが作成されたりします。時折、クラスのロードや、インスタンスの展開、リモートオブジェクトへの接続、ほかのリソースの検索なども、必要に応じてプログラムで実行されるかもしれません。しかし、開始の段階で必要となるのは、プログラムの初期作業の処理に十分な(オブジェクトネットワークの)構造だけです。このような初期構造を提供し、以降の作業の準備を整えるのが、main関数です。
通常は、コアオブジェクトの1つがプログラム全体の監視や入力の制御を担います。コア構造の準備が整うと、mainによって、この監視オブジェクトの作業が開始されます。プログラムがコマンドラインツールやバックグラウンドサーバの場合、作業の開始に必要なのはコマンドライン引数の引渡しや、リモート接続の確立など、簡単な処理かもしれません。しかし、Cocoaプログラムの最も一般的な種類であるアプリケーションの場合には、もう少し複雑な処理が伴います。
アプリケーションの場合、mainによって準備されるオブジェクトのコアグループに、ユーザインターフェイスを描画する何らかのオブジェクトを含める必要があります。このインターフェイスか、または少なくともその一部(アプリケーションのメニューなど)を、ユーザがアプリケーションを起動したときに画面に表示する必要があります。最初のユーザインターフェイスが画面に表示されると、それ以降、アプリケーションは外部のイベントによって駆動されるようになります。イベントの中で最も重要なのはユーザによって引き起こされるイベントです。たとえば、ボタンをクリックする、メニュー項目を選ぶ、アイコンをドラッグする、フィールドに何か入力する、などのイベントがあります。これらのイベントはそれぞれ、ユーザの操作状況に関する詳細な情報とともにアプリケーションに報告されます。そのような情報としては、たとえば、どのキーが押されたか、マウスボタンが押されたか離されたか、カーソルがどの位置にあったか、どのウインドウが影響を受けたか、などがあります。
アプリケーションはイベントを受け取り、そのイベントを調べ、多くの場合、ユーザインターフェイスの一部を描画するなどしてイベントに応えた後、次のイベントを待ちます。ユーザまたはほかの何らかの発生源(タイマーなど)によってイベントが発生する限り、アプリケーションは次々と発生するそれらのイベントを受け取り続けます。起動から終了まで、アプリケーションの処理のほとんどすべてが、イベントという形になるユーザの操作によって駆動されます。
イベントの受け取りとイベントへの対応を行うためのメカニズムのことをメインイベントループと呼びます(“メイン”と呼ぶのは、アプリケーションにおいて短時間実行される従属的なイベントループを設定できるからです)。イベントループは、本質的には1つ以上の入力源が付加された実行ループです。コアグループ内のオブジェクトの1つがメインイベントループの実行を担います。イベントを取得し、最適な処理を実行できる1つまたは複数のオブジェクトにそのイベントをディスパッチした後、次のイベントを取得します。Cocoaアプリケーションでは、NSApplicationのインスタンスであるグローバルアプリケーションオブジェクトが、この調整役を担うオブジェクトになります。メインイベントループの例をFigure 3-1に示します。
ほとんどすべてのCocoaアプリケーションでは、main関数は、関数呼び出しが1つだけある、きわめてシンプルなものです(Listing 3-1を参照)。NSApplicationMain関数は、アプリケーションオブジェクトを作成し、自動解放プールを準備し、最初のユーザインターフェイスをメインのnibファイルからロードして、アプリケーションを実行します。それによって、メインイベントループで受け取るイベントの処理を開始するよう要求します。
Listing 3-1 Cocoaアプリケーションのmain関数
#import <AppKit/AppKit.h> |
int main(int argc, const char *argv[]) { |
return NSApplicationMain(argc, argv); |
} |
“「コアアプリケーションアーキテクチャ」”では、メインイベントループ、グローバルNSApplicationインスタンス、およびその他のコアアプリケーションオブジェクトについて詳しく説明しています。
| < Previous PageNext Page > |
Last updated: 2006-05-23
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |