Objective-C2.0文法メモ カテゴリ

Objective-Cでは既存のクラスに動的にメソッドを追加することができるカテゴリという仕組みがあります。この方法を用いると派生クラスを新たに作成せずに簡単にクラスを拡張することができます。

カテゴリの定義

既存のクラスMyClassが定義されているとします。
MyClass.h

@interface MyClass:NSObject
- (void) method;
@end

MyClass.m

@implementation MyClass
- (void) method;
{
}
@end

MyCategoryというカテゴリを利用して、MyClassに新しくnewMethodを追加してみます。
MyClass.h

@interface MyClass(MyCategory)
- (void) newMethod;
@end

MyClass.m

@implementation MyClass (MyCategory)
- (void) newMethod
{
}
@end

実行する側ではカテゴリを意識する必要なく、単にメソッドを呼び出すだけで済みます。

    MyClass *obj =[[MyClass alloc]init];
    [obj method];
    [obj newMethod];
複数のカテゴリ

別のカテゴリでさらに同じクラスにメソッドを追加することも可能です。

@interface MyClass(MyCategoryExtension)
- (void) newMethodExt;
@end

@implementation MyClass (MyCategoryExtension)
- (void) newMethodExt
{
}
@end

カテゴリによるprivateメソッドの実装

カテゴリの仕組みを利用してPrivateなメソッドを作成することができます。Privateというカテゴリに属するメソッドの定義と実装を.mファイルに追加すれば外側からアクセスすることができません。
MyClass.h

@interface MyClass : NSObject
- (void) method;
@end

MyClass.m

#import "MyClass.h"


// privateメソッド定義
@interface MyClass(Private)
+ (void) classMethod;
- (void) objectMethod;
@end

// privateメソッド実装
@implementation MyClass(Private)
+ (void) classMethod
{    
}
- (void) objectMethod
{
    NSLog(@"call private method");
}
@end

// 本メソッド実装
@implementation MyClass
- (void) method;
{
    [self objectMethod]; // privateメソッド呼び出し
}
@end

main.m

#Import "MyClass.h"

int main (int argc, const char * argv[])
{
    MyClass *obj =[[MyClass alloc]init];
    // publicメソッド
    [obj method];

    // privateメソッド呼び出しできない
    //[obj classMethod];
    
    [obj release];
    return 0;
}

実行するとクラス内部から実行できて、外部から呼び出せないことが確認できます。

call private method