カテゴリにプロパティを追加できれば、継承のように型が変わることなく、もとのクラスの性質を引き継ぎつつ、ちょっとした機能を追加できるので便利です。例えばTAG。
Objective-CのAssociation Referenceを使うと、以下のようなコードで実現できます。
#import <objc/runtime.h>
static char const * const TagKey = "TagKey";
@interface NSObject(TAG)
+(id)objectWithString:(NSString*)string;
@property(nonatomic,retain) id tag;
@end
@implementation NSObject(TAG)
@dynamic tag;
+(id)objectWithString:(NSString *)string
{
self = (id)[[[NSObject alloc] init] autorelease];
[self setTag:string];
return self;
}
- (id)tag
{
return objc_getAssociatedObject(self, TagKey);
}
- (void)setTag:(id)tag
{
objc_setAssociatedObject(self, TagKey, tag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
使い方
NSObject *a = [[[NSObject alloc] init] autorelease]; [a setTag:@"abc"]; NSLog(@"%@", [a tag]); // abc NSObject *b = [NSObject objectWithString:@"def"]; NSLog(@"%@", [b tag]); //def
応用するとNSNumberに有効桁数をもたせたり、NSDateに出力形式をもたせたり、といったことを「先」に定義できます。使い過ぎはアカンですが。
0 件のコメント:
コメントを投稿