これらはカテゴリです。時々非常に役立ちます。
クラスにメソッドを追加するには、メソッドをインターフェース ファイルでカテゴリ名で宣言し、実装ファイルで同じ名前で定義します。カテゴリ名は、メソッドが新しいクラスではなく、別の場所で宣言されたクラスへの追加であることを示しています。ただし、カテゴリを使用してインスタンス変数をクラスに追加することはできません。
カテゴリが追加するメソッドは、クラス タイプの一部になります。たとえば、カテゴリ内の NSArray クラスに追加されたメソッドは、コンパイラが NSArray インスタンスがそのレパートリーに持つことを期待するメソッドとして含まれます。ただし、サブクラスの NSArray クラスに追加されたメソッドは、NSArray タイプには含まれません。(静的型付けはコンパイラがオブジェクトのクラスを知ることができる唯一の方法であるため、これは静的に型付けされたオブジェクトの場合にのみ重要です。)
カテゴリ メソッドは、適切なクラスで定義されたメソッドが実行できることは何でも実行できます。実行時には違いはありません。カテゴリがクラスに追加するメソッドは、他のメソッドと同様に、クラスのすべてのサブクラスに継承されます。
http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html
例:
これは、私がいつも使用しているカテゴリの例です。私は NSMutableArray を所有していませんが、単純な移動機能があればいいのにと思います。単純な関数を追加するためだけにサブクラス化する代わりに、カテゴリを追加します。
// NSMutableArray+Move.h
@interface NSMutableArray (move)
- (void)moveObjectFromIndex:(NSUInteger)from toIndex:(NSUInteger)to;
@end
// NSMutableArray+Move.m
@implementation NSMutableArray (move)
- (void)moveObjectFromIndex:(NSUInteger)from toIndex:(NSUInteger)to
{
if (to != from) {
id obj = [self objectAtIndex:from];
[self removeObjectAtIndex:from];
if (to >= [self count]) {
[self addObject:obj];
} else {
[self insertObject:obj atIndex:to];
}
}
}
これにより、アプリ全体で既に作成されているクラスで新しいことを行うことができます。NSMutableArray を使用する場所ならどこでも、追加したメソッドを次のように呼び出すことができます
NSMutableArray *myArray = [NSMutableArray arrayWithObjects:@"Object A", @"Object B", @"Object C", nil];
[myArray moveObjectFromIndex:0 toIndex:2];