gist

2012年2月28日火曜日

[Objective-C] Association Referenceでカテゴリにプロパティを追加する方法

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