備忘録

開発でつまったところの備忘録.不定期に更新します.

無名カテゴリを用いたprivateなproperty宣言について

これもよく忘れるのでまとめときます

 

まずカテゴリとは

あるクラスの一部分のメソッドを実現するモジュールのこと

で、具体的には

@interface クラス名 (カテゴリ名)

メソッド宣言;

@end

@implementation クラス名 (カテゴリ名)

メソッドの定義;

@end

で書きます。

これによって

・メソッドの数がおおい、規模の大きなクラスで、メソッドをいくつかのカテゴリに分けて記述することでサブモジュールのように分かりやすくすることができる。

・既存のクラスを継承しなくても拡張できる。

・プライベートメソッド(実装部にのみ存在するメソッド)の前方宣言ができる(これについてはxcode4.4から同じファイルに記述されていれば順番関係なくつかえるようになった)。

みたいなことができます。カテゴリではメソッド以外の定義ができません。

 

無名カテゴリとはカテゴリ名を指定しないカテゴリのことで、クラスエクステンションと呼ばれます。

これは

@interface クラス名 ( ) {

インスタンス名;

}

メソッド名;

@end

@implementation

メソッド本体;

@end

のように書きます。

無名カテゴリではメソッドだけでなくインスタンスの宣言もできます。

ここで宣言したメソッドは、クラス本体の実装部に記述しなければなりません。

クラスエクステンション自体にはメソッドをプライベートにする機能はありませんが、クラスエクステンションの宣言を非公開のファイルに記述すればプライベートにすることができます。

またこれを

@interface クラス名 ( )

@property プロパティ名;

@end

のように使うことでプライベートなプロパティを宣言することができます。(無理矢理呼べば使うことはできてしまう)

 

クラスエクステンションで宣言したインスタンス変数はクラス本体および、そのクラスエクステンションの宣言をインポートしたカテゴリで参照できます。(実装部で宣言したインスタンス変数はファイル内のみ有効)