Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

ランタイムシステムとの対話

Objective-Cプログラムは、3つの異なるレベルでランタイムシステムと対話します。

  1. Objective-Cのソースコード経由。

    多くの場合、ランタイムシステムは表立つことなく自動的に機能します。Objective-Cのソースコードを記述して、コンパイルするだけで使用できます。

    Objective-Cのクラスとメソッドを含むコードをコンパイルすると、コンパイラによって言語の動的な特性を実装するデータ構造と関数呼び出しが作成されます。データ構造は、クラスとカテゴリ定義、プロトコル宣言の情報を取り込みます。これには、クラスの定義プロトコルで説明したクラスとプロトコルオブジェクトに加えて、メソッドセレクタ、インスタンス変数テンプレート、およびソースコードから抜き出したその他の情報が含まれます。主要なランタイム関数は、メッセージングの仕組みで説明したように、メッセージを送信する関数です。この関数は、ソースコードのメッセージ式で呼び出します。

  2. FoundationフレームワークのNSObjectクラスで定義したメソッド経由。

    Cocoaのオブジェクトは大部分がNSObjectクラスのサブクラスであるため、ほとんどのオブジェクトはNSObjectクラスで定義されたメソッドを継承します(注目すべき例外は、NSProxyクラスです。詳細については、転送を参照してください)。

    NSObjectメソッドの中には、ランタイムシステムに情報を問い合わせるだけのものもあります。それらのメソッドでは、オブジェクトのイントロスペクションが実行されます。このようなメソッドの例としては、オブジェクトにクラスを確認するように要求するclassメソッド、継承階層におけるオブジェクトの位置を調べるisKindOfClass:isMemberOfClass:、オブジェクトが特定のメッセージを受け入れられるかどうかを調べるrespondsToSelector:、オブジェクトが特定のプロトコルで定義されているメソッドを実装しているかどうかを調べるconformsToProtocol:、メソッドの実装のアドレスを返すmethodForSelector:などがあります。これらのメソッドは、自身のイントロスペクションを行う機能をオブジェクトに提供します。

    これらのメソッドについては、これまでの章で説明しました。また、Foundationフレームワークリファレンス内のNSObjectクラス仕様に詳細な説明があります。

  3. ランタイム関数の直接呼び出し経由。

    ランタイムシステムは、/usr/include/objcディレクトリに格納されている、ヘッダファイル内の関数とデータ構造のセットで構成されるパブリックインターフェイスを持つ動的共有ライブラリです。これらの多くの関数では、Objective-Cコードを記述したときに、コンパイラによって実行されることをプレーンなCを使って再現できます。それら以外は、NSObjectクラスのメソッドを通してエクスポートされる機能の基礎になります。これらの関数により、ランタイムシステムに対する別のインターフェイスを開発し、開発環境を強化するツールを作成することができます。しかし、これらの関数は、Objective-Cでプログラミングする際には必要ありません。ただし、Objective-Cプログラムを記述する際に、ランタイム関数のいくつかが役に立つ場合もあります。これらの関数はすべて『Objective-C 2.0 Runtime Reference』に記述されています。

NSObjectクラスはFoundationフレームワークの継承階層のルートにあるため、そこで定義されているメソッドは通常すべてのクラスに継承されます。したがって、それらのメソッドで、すべてのインスタンスとクラスオブジェクトが備えているべき動作を設定します。しかし、いくつかのケースでは、NSObjectクラスに何をどのように行うかについてのテンプレートが定義されているだけで、必要なコードを全部提供しないことがあります。

たとえば、NSObjectクラスには、クラスの内容を説明する文字列を返すdescriptionインスタンスメソッドが定義されています。これは主にデバッグに使用します(このメソッドが返す文字列は、GDB print-objectコマンドで出力されます)。このメソッドのNSObjectの実装は、対象クラスに何が含まれているかを知らないので、オブジェクトの名前とアドレスが一体となった文字列を返します。NSObjectのサブクラスでは、より詳細な情報を返すために、このメソッドを実装することができます。たとえば、FoundationクラスのNSArrayは、そのクラスに含まれるオブジェクトの説明のリストを返します。



< 前ページ次ページ >


Last updated: 2007-10-31




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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