【コラム】

ダイナミックObjective-C

37 Core Foudation (5) - インスタンスの実装

木下誠  [2006/05/31]

今回は、Core Foundationの基本構成要素の3つ目、CFRuntimeBaseを解説しよう。これは、Core Foudationでのインスタンスを表すものである。

CFRuntimeBaseの3つのフィールド

CFRuntimeBaseは、すべてのCore Foundationオブジェクトの、先頭に位置するものとなる。言い換えると、CFRuntimeBaseを先頭に持っているものが、Core Foundationでのオブジェクトである、と考える事もできる。このようなオブジェクトの例としては、本連載の第34回で、CFStringを取り上げた。この構造体には、文字列を保持するためのフィールドがいろいろとあったが、それらの先頭にあったのが、CFRuntimeBaseである。

では例によって、そのCFRuntimeBaseの定義を見てみよう。Base.subprojディレクトリの下にある、CFRuntime.hに含まれている。

Base.subproj/CFRuntime.h

typedef struct __CFRuntimeBase {
    void *_isa;
    uint16_t _rc;
    uint16_t _info;
} CFRuntimeBase;

このように、3つのフィールドから構成されている。1つ目のフィールドは、_isaである。そう。この連載の読者ならば、この名前に見覚えがあるだろう。Objective-Cで、オブジェクトやクラスの動的な型情報の判別に欠かせなかった、あのisaポインタと同じ名前である。もちろん、これは偶然ではない。CFRuntimeBaseにおけるisaは、Objective-Cでのisaと同じ役割を果たすことになる。また、実はそれ以上の機能も含まれる事になる。ここに隠されている仕組みを解き明かすのが、Core Foundationの秘密の鍵だ。次回以降で、詳しく見ていこう。

次にあるフィールドは、_rcだ。これは、retain countの頭文字になる。日本語では、参照カウント、保持数カウントなどと呼ばれる。このフィールドには、インスタンスの参照カウント数を入れておく。

ここで、少し余談になるが、参照カウントの話をしておこう。ある程度の完成度を有するプログラミング言語やフレームワークならば、メモリ管理の手法を提供している。参照カウントは、その一種だ。基本的な考え方は、あるオブジェクトが誰かに参照されていたら保持する。誰からも参照されなくなったら、解放する、というものだ。Core FoundationおよびObjective-Cも、この手法を使っている。

ただし、近年に登場しているスクリプティング言語や、Javaのようにバーチャルマシンを利用するフレームワークでは、メモリ管理としてガベージコレクタを提供するのが主流になっている。それらと比較すると、参照カウンタという手法は、プログラマの手間が増える分、いささか古くさい感は否めない。だが、機能としては十分であるし、プログラムに応じてメモリ解放のタイミングを決定できるので、最も高いパフォーマンスを得る事ができる事は確かだ。

さて、CFRuntimeBaseの話に戻ろう。最後のフィールドは、_infoだ。名前のとおり、このオブジェクトの情報を表すためのフィールドである。このフィールドの使われ方については、CFRuntime.cにコメントがある。

Base.subproj/CFRuntime.c

/* bits 15-8 in the CFRuntimeBase _info are type */
/* bits 7-0 in the CFRuntimeBase are reserved for CF's use */

つまり、15から8 bit目までは、オブジェクトのタイプを表す。7から0 bit目までは、将来のために予約されている。では、上位8 bitにあるタイプとは何か?実は、ここに設定されるのが、前回紹介したCFTypeIDの値だ。前回の内容を思い出すと、CFTypeIDはクラスを一意に表す整数値だった。わざわざ、すべてのクラスに対してユニークな値を割り振っていたのは、このCFRuntimeBaseで利用するためだ。

以上が、CFRuntimeBaseが持つフィールド、つまりすべてのオブジェクトが持つ情報だ。isaポインタ、参照カウンタ、型情報を表すID、がある。

isaポインタへ

さて。これでCore Foundationの構成要素、CFRuntimeClass、CFTypeID、CFRuntimeBaseを一通り見てきた。だが、お気づきの通り、最も大事なポイントの説明は飛ばしてきた。それは、CFRuntimeBaseのisaポインタである。

次回は、いよいよこれの説明に入ろう。ここから、Core FoudationとObjective-Cの、奇妙で巧妙な関係が見えてくる。

    新着記事

    特設サイトの情報

    人気記事

    一覧

    イチオシ記事

    新着記事

    特別企画

    一覧