きりかノート 3冊め

おあそびプログラミング

RubyCocoa での Objecitve-C から Ruby のクラスメソッドの呼び出し

けっきょく見込みより1週間遅れたし、最近動きが速いようなので、キャッチアップはあきらめ。すべてのメールを既読にしてしまい、興味のあるとこだけコードを確認して、ML のほうにもぼちぼち参戦するような感じで。

で、クラスメソッドがオーバーライドできるようになったそうなので、そこを調べてみることに。知らない人も少なくないと思うのだけれども、RubyCocoa では Cocoa のクラスメソッドをオーバーライドすることができなかっただけではなく、そもそも Objecitve-C 側から Ruby のクラスメソッドの呼び出しができなかったのだ。インスタンスメソッドでは、Objecitve-C の メッセージ転送 を利用している。自分が以前に試したときは、クラスメソッドではこの仕組みが動作しないようだ(NSObject に転送関連のメソッドがクラスメソッドとしても実装はされているが、呼び出されない)ったので、「もう、Objective-C 側に IMP つっこむしかないかなあ」と思っていたのだ。

oc_import.rb の OSX::OCClsWrapper#singleton_method_added では、クラスメソッドのオーバーライドには対応しているものの、そうでないときには Objective-C のランタイム側にはなにもしていない。Ruby 上でメソッドが定義されるだけ。これって非形式プロトコルなんか動くんだろうか。ちょっと疑問。

じゃ、このへんの検証から手を付けることにしよう。つづく。