【コラム】

ダイナミックObjective-C

14 クラスとは何か(1) - Mac OS X/Objective-Cにおけるクラスの実装を読む

    木下誠  [2005/11/09]

    前回の予告通り、Objective-Cランタイムの解説を始めよう。そのまえに、いくつか準備が必要だ。

    ソースコードのダウンロード

    まず、Objective-Cランタイムのソースコードの在処を紹介しよう。本連載を読むのにソースコードは必須ではないが、手元にあると何かと便利なことが多いので、ダウンロードしておくことをお勧めする。

    この連載では、Mac OS XでのObjective-C実装をもとに解説を行なう。ご存知の方もいると思うが、Mac OS Xは商用OSではあるが、カーネルとBSDレイヤのソースコードは、Darwinと呼ばれるオープンソースプロジェクトの下で公開されている。Objective-Cランタイムのソースコードも、これに含まれている。

    ただし、Darwinのソースコードにアクセスするには、ADC (Apple Developer Connection)への登録が必要になる。登録は次のアドレスから行える。Online会員ならば無料である。

    ADC Membership

    Darwinで公開されているソースコードは、次のアドレスから参照することができる。現在のバージョンは、Mac OS Xは10.4.3、Darwinはそれに合わせた8.3となっている。

    Apple - Mac OS X 10.4.3 (Darwin 8.3)

    Darwinに含まれる、多数のプロジェクトのソースコードがあると思う。この中の、「objc4」が目的のObjective-Cランタイムである。現在はobjc4-267というバージョンになっている。これをダウンロードしよう。

    また、Mac OS Xにも標準で、Objective-Cランタイムのヘッダファイルが含まれている。/usr/include/objcディレクトリにあるファイルがそれだ。こちらを参照してもいいだろう。

    ランタイムでは、APIドキュメントも公開されている。こちらも合わせて紹介しておこう。以下のページで見ることができる。

    Objective-CランタイムAPIドキュメント

    このドキュメントの最初のページにも書かれているが、ランタイムAPIは仕様として決まっているものではなく、それぞれの実装に依存している。あくまで、このドキュメントは、Mac OS X版のランタイムAPIということになる。

    クラスとは何か

    これで準備は完了だ。では、始めよう。

    まず、クラスとは何か、というところから始めよう。ここでは、オブジェクト指向においてクラスとはどういう概念か、ということではなく、Objective-Cでクラスはどう実装されているのか、ということを解説する。

    スタート地点として、まず言語仕様を確認しよう。Objective-Cでは、クラスはClass型で表現する。つまり、このClass型の定義が、クラス調査の入り口となる。

    Class型の宣言を見てみよう。ダウンロードしたファイルか、includeディレクトリにある、objc.hファイルの中で宣言されている。

    typedef struct objc_class *Class;

    つまり、Class型とは、構造体objc_classのポインタであるということが分かる。続いて、この構造体objc_classを調べよう。objc-class.hに定義がある。

    struct objc_class {
        struct objc_class *isa;
        struct objc_class *super_class;
        const char *name;
        long version;
        long info;
        long instance_size;
        struct objc_ivar_list *ivars;

        struct objc_method_list **methodLists;

        struct objc_cache *cache;
        struct objc_protocol_list *protocols;
    };

    これが、クラスの実体だ。クラスとは何か、という問いに対する最も端的な答えは、この構造体になる。もちろん、これだけ見ても全く意味がつかめないので、内部を詳しく調べよう。

    クラス構造体で使われている変数は、以下のように分けることができるだろう。

    • クラスの情報
      名前を表すname。メタクラスを表すisa。親クラスを表すsuper_class。バージョンを表すversion。クラス情報のフラグを保持するためのinfo
    • インスタンス変数の情報
      インスタンス変数のサイズを表すinstance_size。インスタンス変数のリストを表すivars
    • メソッドの情報
      メソッドのリストのmethodLists。メソッドをキャッシュしているcache
    • プロトコルの情報
      準拠しているプロトコルのリストのprotocols

    objc_class構造体

    この構造体を見ると、まず一般的なオブジェクト指向の構成要素である、インスタンス変数とメソッドの情報を含むことが分かるだろう。この情報には、メソッドとインスタンス変数の型と名前も含まれている。これが、メソッドおよびインスタンス変数のメタ情報となる。

    他にも、クラスの情報が豊富にあったり、Objective-C特有のものとしてプロトコルの情報があることにも気づくだろう。

    次回は、実際にプログラムを動かしながら、もっと詳しく調べていこう。

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン