Objective-c-categories
提供:Dev Guides
Objective-Cのカテゴリ
特定の状況でのみ役立つ動作を追加することで、既存のクラスを拡張したい場合があります。 そのような拡張機能を既存のクラスに追加するために、Objective-Cは categoories と extensions を提供します。
既存のクラスにメソッドを追加する必要がある場合、たとえば、独自のアプリケーションで何かを簡単に実行できるようにする機能を追加する必要がある場合、最も簡単な方法はカテゴリを使用することです。
カテゴリを宣言する構文は、標準のObjective-Cクラスの説明と同様に@interfaceキーワードを使用しますが、サブクラスからの継承を示すものではありません。 代わりに、このように、括弧内のカテゴリの名前を指定します-
@interface ClassName (CategoryName)
@end
カテゴリーの特徴
- 元の実装ソースコードを持っていない場合でも、カテゴリは任意のクラスに対して宣言できます。
- カテゴリで宣言したメソッドは、元のクラスのすべてのインスタンスと、元のクラスのサブクラスで使用できます。 *実行時に、カテゴリによって追加されたメソッドと元のクラスによって実装されたメソッドに違いはありません。
次に、サンプルのカテゴリ実装を見てみましょう。 CocoaクラスNSStringにカテゴリを追加しましょう。 このカテゴリにより、新しいメソッドgetCopyRightStringを追加して、著作権文字列を返すことができます。 以下に示します。
#import <Foundation/Foundation.h>
@interface NSString(MyAdditions)
+(NSString* )getCopyRightString;
@end
@implementation NSString(MyAdditions)
+(NSString *)getCopyRightString {
return @"Copyright finddevguides.com 2013";
}
@end
int main(int argc, const char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@",copyrightString);
[pool drain];
return 0;
}
プログラムをコンパイルして実行すると、次の結果が得られます。
2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright finddevguides.com 2013
カテゴリによって追加されたメソッドは、クラスとそのサブクラスのすべてのインスタンスで使用できますが、追加メソッドを使用するソースコードファイルにカテゴリヘッダーファイルをインポートする必要があります。インポートしない場合、実行されますコンパイラの警告とエラー。
この例では、クラスが1つしかないため、ヘッダーファイルを含めていません。そのような場合は、上記のようにヘッダーファイルを含める必要があります。