Objective-Cでカテゴリにプロパティを持たせる
<objc/runtime.h> の objc_getAssociatedObject を使えば出来ますよとのこと。
// Sample.h
@interface Sample (SampleCategory).
@property (nonatomic) NSString *value;
@end
// Sample.m
@implementation Sample (SampleCategory)
// 無名カテゴリで宣言すればdynamic宣言は不要みたい
//@dynamic value
-(NSString*)value {
return objc_getAssociatedObject(self, @selector(setValue:));
}
-(void)setValue:(NSString*)val {
objc_setAssociatedObject(self, _cmd, val, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
ネットで検索していたら、objc_setAssociatedObjectのd第二引数が文字列じゃなくて、 const void *key になっていて焦ったりしました。
今は文字列ではなくて、 _cmd で設定するみたいですね。 ちなみに当然同一のキーを利用する必要がある訳ですが、そこは @selector で。