Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
头文件声明:
@interface NSObject (Extension)
@property (nonatomic, strong) NSString *userName;
@property (nonatomic, assign) SEL onImageFinish;
@end
实现的.m文件:
#import "NSObject+Extension.h"
#import
static const void * g_UserNameKey = &g_UserNameKey;
static const void * g_OnImageFinish = &g_OnImageFinish;
@implementation NSObject (Extension)
@dynamic userName;
- (NSString *)userName {
return objc_getAssociatedObject(self, g_UserNameKey);
}
- (void)setUserName:(NSString *)userName {
objc_setAssociatedObject(self, g_UserNameKey, userName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (SEL)onImageFinish {
SEL action;
NSValue *value = objc_getAssociatedObject(self, g_OnImageFinish);
[value getValue:&action];
return action;
}
- (void)setOnImageFinish:(SEL)action {
NSValue *value = [NSValue value:&action withObjCType:@encode(SEL)];
objc_setAssociatedObject(self, g_OnImageFinish, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end