Cappuccinoのフレームワークをカスタマイズする方法
Cappuccinoフレームワークを使って、アプリを開発しているとAppKitやFoundationと言ったフレームワーク部分をカスタマイズしたくなる。カスタマイズしたいケースは、機能拡張がメインとなるが、場合によっては、リリースされているバージョンのバグを修正したいケースなどもある。
Cappuccinoのフレームワーク部分をカスタマイズする方法にはどのようなものがあるか?
再ビルド
真面目にカスタマイズする方法は、再ビルド。XXX.jを修正し、ビルド環境で、rakeし直す。これが一番、正統な方法。
しかし、MacもしくはLinuxで動作するビルド環境が必要なので、Windowsとかでアプリを作っているときは、面倒だ。
JavaScriptへ変換後のソースを修正
AppKitやFoundationをビルドした結果は、AppKit.j、AppKit.sj、Foundation.j、Foundation.sjとなる。これらのファイルの中身を見ると、Objective-JがJavaScriptに変換され、全ファイル分が結合されたものとなっている。Objective-JとJavaScriptはほぼ一対一に変換されているので、目を凝らしてみれば、どの部分がどれにあたるかは容易にわかる。
このJavaScriptに変換されたソースを修正すれば、カスタマイズができるはずである。しかし、修正するだけでは正常に動かない。全てのファイルが結合されており、どこに何があるかは、オフセットにより管理されている。なので、ソースを修正した場合は、ファイルの中で管理されているオフセットも修正してあげる必要がある。
このルールに従って、修正するとカスタマイズができるはずだが、全く動かなかった。ビルドツールがやっていることを手作業でするのは、恐らく、至難の業なのだろう。ということで、この方法は使えない。
カテゴリを使う
フレームワークをカスタマイズするのに、一番リーズナブルな方法がカテゴリを使う方法。
例えば、フレームワーク部分の以下のクラス修正する場合を考える。
@implementation CPXxx : CPObject { } - (void)method0 { yyyy; } - (void)method1 { yyyy; }
このクラスのmethod1をカスタマイズしたい場合は、カテゴリを使う。method1のソースコードをまるごとコピーし、必要な部分だけ修正する。カテゴリ名は自由につけて構わない。
@implementation MyObject(Extension) - (void)method1 { zzzz; }
このようにカテゴリを使えば、フレームワークを再ビルドすることなく、フレームワークで定義されているメソッドを修正(オーバーライド)することができる。