category与associative作为objective-c的扩展机制的两个特性,category即类别,可以通过它来扩展方法;associative,可以通过它来扩展属性;
category在iOS开发中比较常见,相对的associative,就用的比较少了。
要用它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociatedObject以及objc_setAssociatedObject。
objc_getAssociatedObject、objc_setAssociatedObject、objc_removeAssociatedObjects都是Obj-c中的外联方法,object 参数作为待扩展的对象实例,key作为该对象实例的属性的键,而value就是对象实例的属性的值,policy作为关联的策略,它的枚举包括:
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
具体我就多说了,可以看得懂的。
另外,objc_removeAssociatedObjects可以删除指定对象实例的所有扩展属性。
来一个例子
@interface Teacher : NSObject
{
NSUInteger age;
}
@end
#import <objc/runtime.h> //必须滴
const char *ProfessionType = "NSString *";
@implementation Teacher (Profession)
-(void)setProf:(NSString*)prof
{
objc_setAssociatedObject(self, ProfessionType, prof, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)prof
{
NSString *pro = objc_getAssociatedObject(self, ProfessionType);
return pro;
}
@end
现在就可以通过setProf: 和 prof 来存取 teacher 的 profession 值了。