类别(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); }