【コラム】
前回までは、Objective-Cで、クラスはどのように実装されているのかを探っていた。続いて、オブジェクトの実装に話を移そう。クラスをもとにして、どのようにインスタンス化を行うのか、ソースコードレベルで確認しよう。
この連載でも何度か述べているように、Objective-Cにおいて、すべてのオブジェクトはid型で表すことができる。そこで、まずid型の定義を調べることから始めよう。Objective-Cランタイムのヘッダファイル、obc-api.hで見つけることができる。
ここから、id型とは、構造体objc_objectのポインタ型であることが分かる。この構造体は、フィールドを1つだけ持っている。class型であるisaだ。
isaは、このオブジェクトの、クラス定義になる。これにより、あるインスタンスオブジェクトからは、いつでもそのクラス定義、つまり自身のメタ情報、にアクセスできることになる。これが、objective-cの、高い動的特性を実現するためのエントリーポイントになっている。
実際にインスタンスオブジェクトを確保すると、このisaの下にインスタンス変数のためのメモリが確保されることになる。つまり、id型で参照するメモリ領域の大きさは可変長だ。必要になるインスタンス変数のサイズは、クラス定義、つまりisa、から取得できる。objc_class構造体の、instance_sizeフィールドだ。
|
|
objc_object構造体と、その他の構造体の関係 |
実際に、ランタイムのソースコードから、インスタンスオブジェクトを作成する箇所を調べてみよう。Objective-Cでは、インスタンス化はallocというクラスメソッドで行う。allocの実際の処理を行うのは、ランタイムAPIの、class_createInstanceという関数だ。
最初の引数として渡されるのが、クラス定義であるtheClass。2つ目の引数は、インスタンス変数以外に、余分なメモリを確保したい時に指定する、additionalByteCountだ。
この関数の実装は、objc-class.mというファイルにある。実際に挙動を追いかけてみると、最終的に_internal_class_createInstanceFromZoneという関数を呼び出す。ここで、オブジェクトのためのメモリ確保が行われる。
処理の流れとしては、まず、オブジェクトのサイズを求める。次に、メモリを確保する。そして、isaにクラス定義を設定する。基本的にはこれだけだ。これで、オブジェクトとして動作する。この後に、initメソッドなどで、インスタンス変数の初期化などが行われるだろう。
このように、オブジェクトとは何か、ということを実装面から見ると、「クラス定義であるisaフィールドで始まり、インスタンス変数のためのメモリ領域を持つもの」と、なる。
ここで、前回まで説明した、Class型を思い出してみよう。Class型、つまりobjc_class構造体も、メタクラスであるisaで始まっていた。つまり、id型と同じであり、オブジェクトとしての条件を満たしている。「クラスもオブジェクトである」というObjective-Cの言語仕様は、「id型も、Class型も、クラス定義であるisaで始まる」と、実装面からも確認できるということだ。ちなみに、クラスオブジェクトにはクラス変数は存在しないので、objc_class構造体に変数用の可変長領域は必要ない。
では、構造体で先頭にisaがあれば、何でもオブジェクトなのか? まさに、その通りである。たとえば、C言語で構造体を作り、その先頭にisaとしてクラス定義へのポインタを置けば、それでもうObjective-Cのオブジェクトになる。
実は、Mac OS Xでは、実際にこの仕組みを利用して、C言語とObjective-Cのシームレスな接続を実現している。この環境は、Core Foundationと呼ばれる。Mac OS Xでは、CocoaとCarbonという二大フレームワークが存在するが、Objective-CベースのCocoaと、C言語ベースのCarbonの間で、Core Foundationを利用してオブジェクトをそのまま受け渡すことができる。これは、Objective-CがC言語ベースである、ということからくる、大きな利点を活用したものと言えるだろう。
Core Foundationについては、後日、項を改めて詳しく説明しよう。
| 超新星残骸中にないはずの多量の一酸化炭素 - 天文衛星「あかり」が発見 [21:42 2/9] |
| 【レポート】ROBO-ONE委員会 - 第20回大会でのROBO-ONE Lightの開催を決定 [20:27 2/9] |
| 火星に海の存在を示す有力な証拠が発見される - ESAが発表 [18:48 2/9] |
| iOS向けSPDYライブラリが登場、普及はじまるSPDY [11:57 2/9] |
| GitHubのアクティブプロジェクト、もっとも多いのはMITライセンス [11:42 2/9] |
|
[長谷川博己]新人賞受賞で“ミタ”がキタ! 鈴木京香との熱愛は「ご想像にお任せ」 [06:00 2/10] エンタメ |
|
[AKB柏木由紀]「SDN48」ラストシングルMVにゲスト出演 メンバーの10年後の同窓会で再会 [05:00 2/10] ホビー |
|
大東駿介、改名後初の写真集発売--名前を変えたのは「自分の決意表明です」 [00:30 2/10] エンタメ |
|
悲しいけれど超ウマい!極貧芸能人が編み出した奇跡のアイデアレシピベストテン! [00:06 2/10] キャリア |
|
みんなが聴きたい女性アーティスト・ラブソングベスト30を思い出の映像と共に発表! [00:05 2/10] キャリア |