以前の投稿のコメントで 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となっていた。"the modern version of the runtime" とは 2.0 ランタイムを指す。"legacy ..." は 1.0 ランタイムを指す。
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.
なお 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から導入されたのだろうか。
これはいい。試してみよう(続く)。