Objective-Cプログラミング言語(2)クラス、オブジェクト、メッセージ---ランタイムオブジェクト
3434 ワード
転載は出典を明記してください.http://blog.csdn.net/zhangxingping
第1章オブジェクト、クラス、メッセージ
この章では、Objective-Cで使用および実装されるオブジェクト、クラス、およびメッセージの基礎知識について説明します.また、本章ではObjective-C運転時についても説明します.
実行時
Objective-C言語では、コンパイル時から接続時、さらには実行時まで、決定された時間をできるだけ遅らせます.可能な限り、Objective-Cは常に動的な操作を行い、例えば動的にオブジェクトを作成し、どのメソッドを呼び出すべきかを判断します.したがって、Objective-C言語にはコンパイラだけでなく、コンパイルされたコードを実行するためにランタイムシステムも必要です.実行時はObjective-C言語のオペレーティングシステムと見なすことができる.Objective-C言語が正常に動作するように、正式に実行されます.しかし、一般的には、実行時と直接対話する必要はありません.実行時に提供される機能の詳細については、「Objective-C」を参照してください. ランタイムプログラミングガイド
オブジェクト
その名前のように,オブジェクト向けのプログラミングはオブジェクトベースである.オブジェクトによってデータとこれらのデータに作用する特別な操作を関連付ける.Objective-Cでは、このオブジェクトがそのクラスのインスタンスであることを知らずに、オブジェクト変数を識別するための特殊なデータ型が提供されています.
オブジェクトの基本
1つのオブジェクトは、データおよびこれらのデータに作用する操作を関連付け、これらのデータを使用しても変更してもよい.Objective-Cでは、これらの操作をオブジェクトの方法と呼ぶ.これらのデータはインスタンス変数(メンバー変数とも呼ばれる場合がある)と呼ばれます.実際には、1つのオブジェクトは、データ構造と1つの操作のセットを1つのプログラムユニットにバインドします.
Objective-Cでは、オブジェクトのインスタンス変数はオブジェクトにとって内部的である.通常、オブジェクトのステータスにアクセスするには、オブジェクトの方法しかありません.範囲コマンドを使用して、そのサブクラスまたは他のオブジェクトがオブジェクトのインスタンス変数に直接アクセスできるかどうかを指定できます.これは、「インスタンス変数の役割ドメイン」のセクションを参照してください.その他の場合、オブジェクトの情報を知る必要がある場合は、そのオブジェクトに対応する方法を提供する必要があります.例えば、矩形は、外部が彼の大きさと位置を取得できるように方法を提供するべきである.
しかしながら、オブジェクトは、そのために設計された方法しか感知できない.他のタイプのオブジェクト設計の方法を誤って実行することはできません.C言語の関数内部の局所変数が外部に見えないように,オブジェクト対外部も自分のインスタンス変数や方法の具体的な実装を隠す.
id
Objective-Cでは、オブジェクト識別idは特殊なデータ型である.このタイプは、オブジェクトが属するクラスに関係なく、すべてのオブジェクトに共通します.このタイプは、クラスのインスタンスおよびクラスオブジェクト自体に使用できます.
Objective-Cでは、コンストラクション関数の戻り値はidタイプです.デフォルトでは、関数の戻り値もintタイプではなくidタイプです.
キーワードnilは、空のオブジェクト、すなわち値0のidとして定義される.id,nilおよびObjective-Cの他の基本データ型のいくつかは、ヘッダファイル:objc/objc.hで定義されています.
id オブジェクトのデータ構造へのポインタとして定義されます.
各オブジェクトにはisa変数があり、そのオブジェクトがそのクラスのオブジェクトであることを示すために使用されます.Classで タイプ自体はポインタとして定義されます.
typedef struct objc_class * Class;
したがってisaは通常「isaポインタ」と呼ばれます.
ダイナミックタイプ
idタイプの使用自体にはあまり制限はありません.しかし、このタイプ自体は、「オブジェクトである」という情報を示す以外に、そのオブジェクトに関する他の情報はありません.実際のプログラミングでは、オブジェクトに含まれるより多くの情報を知る必要があります.idという識別がコンパイラに十分な情報を提供できない以上、各オブジェクトは実行時にこれらの必要な情報を提供する必要がある.
isaインスタンス変数は、オブジェクトが属するクラスを識別します.それは、オブジェクトがそのタイプであることです.同じ動作(メソッド)と同じタイプのデータ(インスタンス変数)を持つオブジェクトは、同じクラスのメンバーです.
実行時にオブジェクトのタイプが動的に決定されます.必要に応じて、ランタイムシステムは、そのクラスに正確に属するオブジェクトを見つけることができます.これは相手に尋ねるだけです.(詳細については、「Objective-Cランタイムプログラミングガイド」を参照してください)Objective-Cのダイナミックタイプは、後述するダイナミックバインドの基礎です.
isa変数はまた、オブジェクト自体に「自省」機能、すなわち、自身の情報を理解させる.コンパイラは、実行時に使用するためにクラスの定義情報をデータ構造に記録します.実行時の関数はisaを使用して、実行時にこれらの情報を検索します.たとえば、ランタイムシステムを使用することで、オブジェクトが特定の方法を実装しているかどうか、またはその親がそのクラスであるかどうかを判断することができます.
クラスの詳細については、後述する章で説明します.
同様に,あるオブジェクトが属するクラスに関するコンパイラの情報を,符号化時にクラス名を用いて静的に伝えることができる.クラスは特殊なオブジェクトで、クラス名はタイプ名として使用できます.詳細については、「クラスタイプ」および「静的動作を可能にする」に関する章を参照してください.
メモリ管理
すべてのプログラムでは,オブジェクトが不要なときに正しく破棄され,占有スペースが正しく解放されることを確保することが重要である.そうしないと、アプリケーションが消費するメモリが必要なサイズを超え、無駄になります.同様に,まだ使用されているオブジェクトを誤って破棄しないようにし,その空間を解放することも重要である.
Objective-cでは、上記の目的を達成するために2つのメモリ管理メカニズムが提供されています.はカウントを参照します.このメカニズムを使用すると、オブジェクトのライフサイクルは完全に私たちのコントロールの中にあり、メモリの申請と解放も完全に担当します.参照カウントの詳細については、『メモリ管理プログラミングガイド』を参照してください. ごみ回収.このメカニズムを使用すると、対象ライフサイクルの管理を自動「回収器」に渡します.ごみ回収メカニズムについては、「ごみ回収プログラミングガイド」を参照してください.(iOSはごみ回収メカニズムをサポートしていないため、iOS開発者センターではこの本は見られません.)
第1章オブジェクト、クラス、メッセージ
この章では、Objective-Cで使用および実装されるオブジェクト、クラス、およびメッセージの基礎知識について説明します.また、本章ではObjective-C運転時についても説明します.
実行時
Objective-C言語では、コンパイル時から接続時、さらには実行時まで、決定された時間をできるだけ遅らせます.可能な限り、Objective-Cは常に動的な操作を行い、例えば動的にオブジェクトを作成し、どのメソッドを呼び出すべきかを判断します.したがって、Objective-C言語にはコンパイラだけでなく、コンパイルされたコードを実行するためにランタイムシステムも必要です.実行時はObjective-C言語のオペレーティングシステムと見なすことができる.Objective-C言語が正常に動作するように、正式に実行されます.しかし、一般的には、実行時と直接対話する必要はありません.実行時に提供される機能の詳細については、「Objective-C」を参照してください. ランタイムプログラミングガイド
オブジェクト
その名前のように,オブジェクト向けのプログラミングはオブジェクトベースである.オブジェクトによってデータとこれらのデータに作用する特別な操作を関連付ける.Objective-Cでは、このオブジェクトがそのクラスのインスタンスであることを知らずに、オブジェクト変数を識別するための特殊なデータ型が提供されています.
オブジェクトの基本
1つのオブジェクトは、データおよびこれらのデータに作用する操作を関連付け、これらのデータを使用しても変更してもよい.Objective-Cでは、これらの操作をオブジェクトの方法と呼ぶ.これらのデータはインスタンス変数(メンバー変数とも呼ばれる場合がある)と呼ばれます.実際には、1つのオブジェクトは、データ構造と1つの操作のセットを1つのプログラムユニットにバインドします.
Objective-Cでは、オブジェクトのインスタンス変数はオブジェクトにとって内部的である.通常、オブジェクトのステータスにアクセスするには、オブジェクトの方法しかありません.範囲コマンドを使用して、そのサブクラスまたは他のオブジェクトがオブジェクトのインスタンス変数に直接アクセスできるかどうかを指定できます.これは、「インスタンス変数の役割ドメイン」のセクションを参照してください.その他の場合、オブジェクトの情報を知る必要がある場合は、そのオブジェクトに対応する方法を提供する必要があります.例えば、矩形は、外部が彼の大きさと位置を取得できるように方法を提供するべきである.
しかしながら、オブジェクトは、そのために設計された方法しか感知できない.他のタイプのオブジェクト設計の方法を誤って実行することはできません.C言語の関数内部の局所変数が外部に見えないように,オブジェクト対外部も自分のインスタンス変数や方法の具体的な実装を隠す.
id
Objective-Cでは、オブジェクト識別idは特殊なデータ型である.このタイプは、オブジェクトが属するクラスに関係なく、すべてのオブジェクトに共通します.このタイプは、クラスのインスタンスおよびクラスオブジェクト自体に使用できます.
Objective-Cでは、コンストラクション関数の戻り値はidタイプです.デフォルトでは、関数の戻り値もintタイプではなくidタイプです.
キーワードnilは、空のオブジェクト、すなわち値0のidとして定義される.id,nilおよびObjective-Cの他の基本データ型のいくつかは、ヘッダファイル:objc/objc.hで定義されています.
id オブジェクトのデータ構造へのポインタとして定義されます.
typedef struct objc_object
{
Class isa;
} * id;
各オブジェクトにはisa変数があり、そのオブジェクトがそのクラスのオブジェクトであることを示すために使用されます.Classで タイプ自体はポインタとして定義されます.
typedef struct objc_class * Class;
したがってisaは通常「isaポインタ」と呼ばれます.
ダイナミックタイプ
idタイプの使用自体にはあまり制限はありません.しかし、このタイプ自体は、「オブジェクトである」という情報を示す以外に、そのオブジェクトに関する他の情報はありません.実際のプログラミングでは、オブジェクトに含まれるより多くの情報を知る必要があります.idという識別がコンパイラに十分な情報を提供できない以上、各オブジェクトは実行時にこれらの必要な情報を提供する必要がある.
isaインスタンス変数は、オブジェクトが属するクラスを識別します.それは、オブジェクトがそのタイプであることです.同じ動作(メソッド)と同じタイプのデータ(インスタンス変数)を持つオブジェクトは、同じクラスのメンバーです.
実行時にオブジェクトのタイプが動的に決定されます.必要に応じて、ランタイムシステムは、そのクラスに正確に属するオブジェクトを見つけることができます.これは相手に尋ねるだけです.(詳細については、「Objective-Cランタイムプログラミングガイド」を参照してください)Objective-Cのダイナミックタイプは、後述するダイナミックバインドの基礎です.
isa変数はまた、オブジェクト自体に「自省」機能、すなわち、自身の情報を理解させる.コンパイラは、実行時に使用するためにクラスの定義情報をデータ構造に記録します.実行時の関数はisaを使用して、実行時にこれらの情報を検索します.たとえば、ランタイムシステムを使用することで、オブジェクトが特定の方法を実装しているかどうか、またはその親がそのクラスであるかどうかを判断することができます.
クラスの詳細については、後述する章で説明します.
同様に,あるオブジェクトが属するクラスに関するコンパイラの情報を,符号化時にクラス名を用いて静的に伝えることができる.クラスは特殊なオブジェクトで、クラス名はタイプ名として使用できます.詳細については、「クラスタイプ」および「静的動作を可能にする」に関する章を参照してください.
メモリ管理
すべてのプログラムでは,オブジェクトが不要なときに正しく破棄され,占有スペースが正しく解放されることを確保することが重要である.そうしないと、アプリケーションが消費するメモリが必要なサイズを超え、無駄になります.同様に,まだ使用されているオブジェクトを誤って破棄しないようにし,その空間を解放することも重要である.
Objective-cでは、上記の目的を達成するために2つのメモリ管理メカニズムが提供されています.