ページ

2009年10月16日金曜日

Objective-C 2.0 ランタイムの情報

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

以前の投稿のコメントで Objective-C 2.0 になってからランタイムのインターフェイスが大幅に変更されたとの情報をもらった(有益な情報どうも)。

Cocoaの日々: Safari用独自プラグインを作る(2) - Posing と Method Swizzling
(下の方にコメントがある)

runtime.h にあった OBJC2_UNAVAILABLE というラベルは 2.0 ランタイム以降では使えないことを示すらしい(ただし互換性のために残してある)。
runtime.h

struct objc_method {
    SEL method_name        OBJC2_UNAVAILABLE;
    char *method_types     OBJC2_UNAVAILABLE;
    IMP method_imp         OBJC2_UNAVAILABLE;
}                          OBJC2_UNAVAILABLE;
ということは前回までで紹介していた Method構造体の中の値を直接書き換える方法は推奨されないということになる。ざっと眺めたところではそれに変わる構造体定義は見つけられなかった。実装は隠されたということか(互換性目的の opaqueインターフェイスとして上記構造体が残っている)。


また今後の 64bit 環境では 2.0 のランタイムを使わないと駄目らしい。

以下、2.0 のランタイム情報。
Mac Dev Center: Objective-C 2.0 Runtime Programming Guide: Introduction(英語)

この中の Platforms を引用すると
Platforms

iPhone applications and 64-bit programs on Mac OS X v10.5 and later use the modern version of the runtime.

Other programs (32-bit programs on Mac OS X desktop) use the legacy version of the runtime.
となっていた。"the modern version of the runtime" とは 2.0 ランタイムを指す。"legacy ..." は 1.0 ランタイムを指す。

なお 1.0 のラインタム情報は "Not Recommended" 扱いになっている。
Legacy: Objective-C 1 Runtime Reference (Not Recommended)(英語)


2.0 ランタイムの API リファレンス
Mac Dev Center: Objective-C 2.0 Runtime Reference(英語)

この中に 1.0 から 2.0 に上がるに伴って変更された構造体や関数の説明が掲載されている。
Mac Dev Center: Objective-C 2.0 Runtime Reference: Mac OS X Version 10.5 Delta

いくつか deperecated になっているものもある。


さて、
Method構造体を直接触ることが推奨されないとしたら、メソッドの置換はどうやれば良いのだろうか?


このリファレンスを眺めていると method_exchangeImplementations という関数があることに気がついた。
Mac Dev Center: Objective-C 2.0 Runtime Reference

引用させてもらうと:



ああ、これってメソッド置換の関数だ。Method構造体などを直接触ることなく API呼び出しで置換できるようになったのか。ほー。
1.0のリファレンスでは見当たらなかったので、これは 2.0から導入されたのだろうか。

これはいい。試してみよう(続く)。