ランタイムAPI

ここまでKVCやKVOを使ったり実行されているメソッドの情報を取得してきたが、いよいよObjective-Cにおけるクラスのランタイムつまり実行時のメタ情報(メタクラス、プロパティ、フィールド)を取得する要求が出て来た。

JavaC#の場合、リフレクション機能を使うことでランタイムの情報には簡単にアクセスできるのだが、Objective-Cにはリフレクション機能は用意されていない。FoundationにはNSInvocationやNSMethodSignature等のメタ情報をラップしたクラスは用意されているがリフレクションのように自由にクラスのメタデータにアクセスすることはできないのだ。

その代わりObjective-CにはFoundationよりも低レベルな「ランタイムAPI」が用意されており、このAPIを使ってランタイムのメタ情報にアクセスできるようになっている。
Objective-C Runtime Reference

ランタイムAPIC言語で書かれており、より低レベルなコーディングを行わなければならない。

例) ランタイムAPIでクラスに任意の名前のプロパティがあるか否かを検査する
+ (BOOL)hasProperty: (NSString *) name
{
    return class_getProperty(self, [name UTF8String]) != NULL;
}

この「ランタイムAPI」の情報だが、日本語の情報も含めてかなり少ないので書籍を購入することにした。

Dynamic Objective-C

Dynamic Objective-C


この書籍はご存じの方も多いだろうが、マイナビニュースの連載コラム「ダイナミック Objective-C」を纏めたものであり、通常のObjective-Cの解説では書かれていない多くのランタイム情報についての知識を手に入れることができるのでお勧めだ。
ダイナミックObjective-C | コラム | エンタープライズ | マイナビニュース

今後はこの情報を使って、いろいろ試して自分の作りたいものに近づいていく予定だ。