最終更新:2013-01-10 (木) 10:59:33 (1718d)  

Objective-C/カテゴリ はてなブックマークを見る
Top / Objective-C / カテゴリ

@interface ClassName (CategoryName)
@end

サブクラス化を行わずに既存のクラスの機能を拡張できる強力な機能

  • 既存のクラスにちょっとした機能を追加する場合、まったく新たにクラスを実装する代わりに、カテゴリを定義し、特有の機能だけを追加定義する、という方法が使える。

書き方

  • "クラス名"にメソッドを追加
  • 新しいヘッダファイルで定義する
    @interface 拡張するクラス名 (カテゴリ名)
      //メソッドの宣言
    @end
    @implementation 拡張するクラス名 (カテゴリ名)
      //メソッドの実装
    @end

注意点

  • カテゴリを使用すると、メソッドを既存のクラス(自分がソースを持っていないクラス)に追加できる。
  • カテゴリに宣言したメソッドの名前が、元のクラスにあるメソッド、あるいは同じクラス(やそのスーパークラス)の他のカテゴリにあるメソッドと同じである場合、実行時にどの実装が呼び出されるかは不定
  • カテゴリを使って、クラスにインスタンス変数を追加することはできません。
  • インスタンス変数に値を保持する通常のプロパティを追加するためには、クラス拡張の機能を使う

メソッドの追加

  •  //HogeObjectにHogeHogeCategoryのメソッドを追加。(hoge.hに書いてもいいし、別ファイルにしても良い)
     @interface HogeObject(HogeHogeCategory)
     -(void) setHogeHoge:(id)hoge;
     -(id) hogeHoge;
     @end

非形式プロトコル

関連