メインメニューを開く

差分

 
=== カテゴリ ===
カテゴリはメソッドのコレションをラス定義をグループに分割たり既存のクラス定義後追加オーバーライメソッドを行なう追加したりするための言語
 
元はひとつのクラスの実装を関連するメソッド群毎に別々の場所に分割して記述することを可能とする目的で作られた。
特徴的なのは、メソッドのオーバーライドが、カテゴリがロードされたタイミングで実行時に行われるという点で、これにより外部モジュールで基盤モジュールを置き換えることができる。したがって、カテゴリを用いればオリジナルコードの再コンパイルなしにルートクラスの挙動を変更することさえ可能となる。また機能追加のためだけのサブクラス化を行なう必要がなくなる点は特筆に値する。
 
このほか、カテゴリに宣言したメソッドが実行時にカテゴリがロードされたタイミングでクラスへ追加される、という性質を応用して、ソースコードを直接修正できないクラスに対してサブクラスを定義せずにメソッドを追加する、といった用途や、Informalプロトコルの定義等にも用いられる。
カテゴリが上述のInformalプロトコルに利用できるのは、ロードが実行時に行われるという構造上、コードのリンク時に実装が存在する保証がなく、インターフェースのみが先行する形になることから。
 
カテゴリメソッドで既存のメソッドをオーバーライドすることも可能であるが、推奨されていない。
応用範囲は非常に広く、単純にクラス定義を複数の機能クラスターから構成するために用いることもあれば、先に挙げたフレームワークのパッチやInformalプロトコルに用いるケースなど多岐にわたる。プログラムの可読性や設計のしやすさ全般に貢献している。
 
==== カテゴリによるオーバーライドの例 ====
<source lang="objc">
@interface NSObject (BetterHash)
匿名利用者