类别(category) 可以在不获悉、不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别(category)具有更高的优先级。
另外extensions的不同在于可以添加属性,添加的方法是必须要实现的;
在正常的情况下,类别是不能添加属性的,但是可以通过rumtime添加一个伪属性,具体实现代码
objc_AssociationPolicy的定义
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
// textItem.h 文件中只有一个name的属性,通过rumtime给类别添加一个age属性。 .h文件 #import "textItem.h" #import <objc/runtime.h> @interface textItem (category) @property (nonatomic,copy) NSString *age; @end ********************* .m文件 #import "textItem+category.h" @implementation textItem (category) - (NSString *)age{ return objc_getAssociatedObject(self, _cmd); } - (void)setAge:(NSString *)age{ objc_setAssociatedObject(self, @selector(age), age, OBJC_ASSOCIATION_COPY_NONATOMIC);
} @end ******************* 在VC中实现 - (void)viewDidLoad { [super viewDidLoad]; textItem *item = [[textItem alloc]init]; item.name = @"张三h"; item.age = @"123"; NSLog(@"%@ %@",item.name,item.age); }