2010年7月16日金曜日

[Objective-C] Objective-Cのカテゴリを使ってみる

Objective-Cのself,superを確認してみるのプログラムをObjective-Cのカテゴリを使ってきちんと動作するようにしてみる.

#import <Foundation/Foundation.h>

@interface NSObject (MyTest)
- (id) methodA;
@end

@implementation NSObject (MyTest)
- (id)methodA
{
  NSLog(@"NSObject");
}
@end

@interface TestA:NSObject
- (id) methodA;
- (id) methodB;
- (id) methodC;
@end

@implementation TestA
- (id) methodA
{
  NSLog(@"class A");
}

- (id) methodB
{
  [self methodA];
}

- (id) methodC
{
  [super methodA];
}
@end

@interface TestB : TestA
- (id) methodA;
@end

@implementation TestB
- (id) methodA
{
  NSLog(@"class B");
}
@end

int main(void){
  SAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  TestB *objB = [[TestB alloc] init ];
  //selfの確認
  [objB methodB];
  //superの確認
  [objB methodC];
  return 0;
}

実行結果

2010-07-16 06:55:59.383 a.out[512:903] class B
2010-07-16 06:55:59.385 a.out[512:903] NSObject

カテゴリを用いたことで,NSObjectにmethodAを実装することができました.

Objective-Cのカテゴリはメソッドの整理だけではなく,既存クラスにmethodを追加することができます.これは非常に便利ですが,やはり既存クラスに追加するのは,できる限りさけたいものです.

カテゴリで注意しなければならないのは,インスタンス変数を付加できないということ,そして,既存のクラスのメソッドと同じ名前でメソッドを定義すると,上書きができてしまうことです.これはメリットでもありデメリットでもあります.上書きした場合,元のメソッドは呼び出すことはできません.

0 件のコメント:

コメントを投稿