きりかノート 3冊め

おあそびプログラミング

Cocoa のクラスとバンドルの関係は?

ひ日誌の「Rubyで書いたObjective-Cのクラスはメインバンドルに所属」にコメント書けなかったのでこっちに。

状況としては、Cocoa の中で持ってる、クラスとバンドルファイルのマッピングの関係がうまく登録されてないようだ。いくつかキーワードを試してみて、"objc_addClass" と "bundleForClass" での検索で PyObjC のほうでも同様の問題に遭遇していたらしい ことがわかる。

じゃ、PyObjC ではどうやって解決しているのかっていうと、NSBundle のメソッドをオーバーライドして自前のマッピングにもとづいてクラスの定義された(であろう)バンドルを返すようにしている。

Apple の objc-runtime のコードを読んだ感じでは、mach-o のバンドルファイル(MH_BUNDLE)をロードしたときだけイメージ中のクラスにたいして特殊な処理をしているようだ。objc_addClass() のときには、そういったことはしていないのでメインバンドルになってしまうと。

解決方法としては

  • PyObjC と同じように NSBundle を変更する
  • NSBundle.loadNibNamed_owner_ を使うのはあきらめる

前者かなあ。