blogを移動しました。
http://kurokawh.blogspot.jp/2010/03/objective-c.html を参照ください。


Objective-C のカテゴリについて「できること」「できないこと」をまとめました。

<<できないこと>>
  • 同じクラスの別のカテゴリに宣言されているメソッドを確実にオーバーライドすること
    =>クラスの @interface セクションで明示的に宣言されているメソッドの再定義を避けるべき
    リンク順で呼ばれる関数が変わってしまう・・・
  • クラスのインスタンス変数の追加
  • 既存のカテゴリと同名のカテゴリの追加
  • 同じクラスに定義されている同名のメソッドの呼び出し
<<できること>>
  • クラスへのインスタンスメソッド追加
  • クラスへのクラスメソッド(スタティックメソッド)追加
Appleの「Object C 言語」には「カテゴリの使い方」として以下のような例が挙げられています。
  • 関連するメソッドをグループ化する簡単な方法を提供します。異なるクラスで定義した類似のメソッドを、同じソースファイルにまとめることができます。
  • 複数の開発者がクラス定義に取り組むような大きなクラスの管理を簡素化できます。
  • 非常に大きなクラスについて、インクリメンタルコンパイルのメリットがある程度得られます。
  • よく使用するメソッドについて、参照の局所性を向上するのに役立ちます。
  • 個々のアプリケーションに合わせてクラスを異なるように設定することが可能となり、同じソースコードのさまざまなバージョンを維持する必要性をなくします。
「既存 API の上書きを行わない」ということに注意していれば、それなりに便利に使えるのでしょう。
既存 API の上書きについて、ruby のクラス再定義に近いのかと思いましたが、ruby が「後勝ち」を保証しているのに対し、objective-c では「未定義」となっているので注意が必要です。
ruby は alias を駆使してオリジナルの API を呼ぶための方法が提供されている点も大きな違いです。