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

< 前ページ次ページ >

オブジェクト

オブジェクト指向プログラムは、その名称が示すように、オブジェクトを中心に構築されます。オブジェクトは、データと、そのデータを使用したりデータに作用したりする特定の操作を関連付けたものです。Objective-C では、このような操作はオブジェクトのメソッドと呼ばれています。オブジェクトが作用する対象となるデータはインスタンス変数です。要するに、オブジェクトはデータ構造(インスタンス変数)とプロシージャのグループ(メソッド)を、自己完結型のプログラミング単位にまとめたものです。

たとえば、線、円、長方形、テキスト、ビットマップ画像などを組み合わせたイメージを作成できるドロープログラムを作成している場合は、ユーザが操作できるいろいろな基本形状のクラスを作成することが考えられます。たとえば、Rectangleオブジェクトは、図面内での長方形の位置に加えて、幅と高さを識別するインスタンス変数を持つことができます。その他にも、長方形の色、塗りつぶし、表示に使用する線パターンなどを定義するインスタンス変数が考えられます。Rectangleクラスは、インスタンスの位置、サイズ、色、塗りつぶし状態、線パターンを設定するメソッドに加えて、インスタンスを表示するメソッドを持つことになります。

Objective-Cでは、オブジェクトのインスタンス変数はオブジェクトに内在し、一般に、オブジェクトのメソッドによってのみオブジェクトの状態にアクセスできます(有効範囲を指定するディレクティブを使えば、サブクラスや他のオブジェクトからインスタンス変数に直接アクセスできるかどうか指定できます。詳細については、インスタンス変数の有効範囲を参照してください)。他者がオブジェクトに関する情報を得るには、情報を提供するメソッドがなければなりません。たとえば、Rectangleオブジェクトは、そのサイズと位置を示すメソッドを持っています。

さらに、オブジェクトはそのオブジェクト用に設計されたメソッドだけを認識するため、他の型のオブジェクトを対象としたメソッドを誤って実行することはありません。ローカル変数の保護のため、C関数がプログラムの他の部分からローカル変数を隠すのと同じように、オブジェクトもそのインスタンス変数とメソッド実装を隠します。

このセクションの内容:

id
動的型定義


id

Objective-Cでは、オブジェクト識別子idという明確なデータ型として定められています。この型はオブジェクトへのポインタとして定義されています。実際には、オブジェクトのインスタンス変数、つまりオブジェクトに一意のデータへのポインタです。C言語の関数や配列のように、オブジェクトはアドレスで識別されます。すべてのオブジェクトは、そのインスタンス変数やメソッドにかかわらず、id型です。

id anObject;

メソッドの戻り値など、Objective-Cのオブジェクト指向構成体では、idはデフォルトデータ型としてintから置き換わりました(関数の戻り値など、Cに限定される構成体については、デフォルトの型はintのままです)。

キーワードnilは、NULLオブジェクト、すなわち値が0idとして定義されます。idnil、その他のObjective-Cの基本的な型はヘッダファイルobjc/objc.hで定義されています。

動的型定義

id型は完全に非制限的です。単独では、対象がオブジェクトであること以外の情報は示しません。

しかし、すべてのオブジェクトは同じではありません。Rectangleオブジェクトのメソッドとインスタンス変数は、ビットマップ画像を表すオブジェクトのものと同じではありません。ある時点で、プログラムは含んでいるオブジェクトに関する詳細な情報(オブジェクトのインスタンス変数、実行できるメソッドなど)を検出する必要があります。id型指示子はこのような情報をコンパイラに提供できないため、各オブジェクトが実行時にこれらの情報を提供できる必要があります。

すべてのオブジェクトがオブジェクトのクラス(どんな種類のオブジェクトか)を示す isaインスタンス変数を持っているため、情報の提供が可能です。すべてのRectangleオブジェクトは、Rectangleであることをランタイムシステムに通知することができます。また、すべてのCircleオブジェクトもCircleであることを通知することができます。同じ振る舞い(メソッド)と同じ種類のデータ(インスタンス変数)を持つオブジェクトは、同じクラスのメンバです。

このように、オブジェクトは実行時に動的に型定義されます。必要な場合はいつでも、オブジェクトに要求するだけで、ランタイムシステムはオブジェクトが属している正確なクラスを検出することができます。Objective-Cの動的型定義は、後述する動的バインディングの基礎となります。

また、isaポインタによって、オブジェクトがイントロスペクションを実行して、オブジェクト自身(または他のオブジェクト)に関する情報を検出することが可能になります。コンパイラは、クラス定義に関する情報をデータ構造に記録して、ランタイムシステムが使用できるようにします。ランタイムシステムの関数は、isaを使用して、実行時にこの情報を検出します。ランタイムシステムでは、たとえば、オブジェクトが特定のメソッドを実装しているかどうかを突き止めたり、そのスーパークラスの名前を調べたりできます。

オブジェクトクラスの詳細については、クラスを参照してください。

また、ソースコードの中でクラス名を使用して静的に型定義することで、オブジェクトのクラスに関する情報をコンパイラに提供することもできます。クラスは特別な種類のオブジェクトであり、クラス名は型の名前として機能します。詳細については、クラスの型静的な振る舞いの実現を参照してください。



< 前ページ次ページ >


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