カテゴリは、クラスにメソッドを追加できたりと実現できることは継承に近い。
カテゴリを使う利点としては
・クラスクラスタを継承する場合には面倒な面も多いためカテゴリで機能追加をするほうが簡単
・元々のクラスの機能に付与でき、そのクラスを使用しているコードを書き換える必要がない。
がある。
NSStringをカテゴリを用いて機能拡張することを考える。
(NSStringはクラスクラスタに属する。)
カテゴリNSString+Foo.h、NSString+Foo.mでは、
barメソッドの追加とlowercaseStringの書き換えを行った。
main関数の中では、元々のNSStringしかimportしていないが
NSStringの機能が追加・拡張されていることが確認できる。
参考までに検証に用いたコードを以下に示す。
NSString+Foo.h
#import <Foundation/Foundation.h>
@interface NSString (Foo)
-(void)bar;
@end
NSString+Foo.m
#import "NSString+Foo.h"
@implementation NSString (Foo)
-(NSString *)lowercaseString
{
return [self stringByAppendingString:@"foobar"];
}
-(void)bar
{
NSLog(@"bar is called");
}
@end
main.m
#import <Foundation/NSString.h>
int main()
{
NSString *msg= [[NSString alloc] init];
msg = @"lowercaseString";
NSLog(@"msg:%@",[msg lowercaseString]);
objc_msgSend(msg,@selector(bar));
return 0;
}