【コラム】
前回は、クラスを表す型Classが、obc_class構造体であることを説明した。今回は、実際にこの構造体の中身を触ってみることにしよう。Objective-Cというプログラミング言語は、ランタイムの記述言語であるC言語を完全に含んでいるため、簡単に自分の中身にアクセスすることができる。
まず、Class型を取り出すことから始めよう。ランタイムにまで目を向けたおかげで、Class型もいろいろな方法で取り出すことができるようになる。
Objective-cでは、これまで説明してきたように、Classメソッドを使ってClass型を取得する。Classメソッドは、ルートクラスであるNSObjectで定義されているメソッドであり、すべてのインスタンスオブジェクトからClass型を取り出すことができる。また、クラスオブジェクトから取り出す、クラスメソッドとしてのClassもある。
また、Cocoaが提供している関数を使う方法もある。文字列を指定してClassを取得する、NSClassFromStringという関数だ。文字列を表すクラスであるNSStringを使って、クラス名を指定して取り出す。この2つが、通常使う方法だ。
これらに加えて、ランタイムAPIを使うこともできる。objc_getClassとobjc_lookUpClassという関数を使う方法だ。これらは、C文字列で指定されたクラス名に対するClass型を返す。2つの関数の違いは、指定したクラスが見つからなかったときの動作だ。objc_getClassでは登録されたハンドラを呼び出し、objc_lookUpClassはNULLを返す。これらは、objc/objc-runtime.hで宣言されている。
実際の使い方を、ソースコードで示そう。NSStringクラスに対応するClass型を取り出す例だ。
このように、Objective-Cのメソッド、ユーティリティ関数、ランタイムAPIと、異なったレベルで実現されている。これらを混ぜ込んで使えるのが、面白いところだ。もちろんいずれも実行結果は同じになる。
では、Class型に直接アクセスしてみよう。前回説明したように、Class型とはobjc_class構造体のポインタのことである。そしてobjc_classにはnameという、クラスの名前を示すフィールドがある。これを使って、クラス名を表示してみよう。
このように、直接キャストして使ってしまえばいい。Objective-Cのクラスとは、結局のところC言語の構造体であり、それ以上でもそれ以下でもない、ということが実感できるかと思う。他のフィールドにも、同様にアクセスすることができる。
クラス名を指定してClassを取り出すAPIがあるということは、ランタイムのどこかでクラス情報をまとめ管理していることを意味する。実際、このすべてのクラス情報に、直接アクセスするためのAPIもある。objc_getClassListだ。
この関数は、ランタイムにあるクラス情報を、引数のbufferにコピーする。登録されているクラスの数を調べることもでき、bufferにNULLを渡すと、クラスの数を返す。
これを使って、現在のランタイムにあるすべてのクラス名を表示してみよう。
実行すると、クラス名の一覧が表示される。面白いことに、Cocoaだけでなく、リンクされているすべてのフレームワークのクラス名を表示することができる。クラス名から、フレームワークの隠れた動作をいろいろ推測することができて楽しい。
このように、Class型の内部構造と、ランタイムAPIを使うことで、Objective-Cの言語仕様には含まれない情報にアクセスすることができるようになる。いや、むしろこれらも含めてObjective-Cの機能というべきか。
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
TVアニメ『ソードアート・オンライン』、7月放送開始! キービジュアル公開 [21:58 2/10] ホビー |
|
CP+2012 各社ブースレポート集 [21:48 2/10] 家電 |
|
ソニエリ、「Xperia NX」の展示イベント開催 - 東京・名古屋・大阪で実施 [21:40 2/10] 携帯 |
|
【レポート】CP+2012 - 「EOS-1D X」展示や吉高由里子のトークショーに人だかりが - キヤノン [21:35 2/10] 家電 |
|
「エウレカセブンAO」オリジナル物語をニュータイプA連載 [21:35 2/10] ホビー |