カテゴリにプロパティを追加できれば、継承のように型が変わることなく、もとのクラスの性質を引き継ぎつつ、ちょっとした機能を追加できるので便利です。例えば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 件のコメント:
コメントを投稿