分类(Category) 和 类扩展(Extension)
分类(Category)
1、给已经存在的类增加方法(可以不实现),不能增加成员变量(可以通过Runtime来给分类添加属性)
2、分类可以访问原来类中的成员变量
3、如果分类和原来的类出现同名的方法,优先调用分类中的方法 优先级是:分类 (最后参与编译) -> 原来类 -> 父类
4、分类可以重新实现原来类中的方法,但是会覆盖掉原来类方法,导致原来类的方法无法使用
优点: 1、减少单个文件的体积 2、把不同的功能组织到不同的Category 中,方便多个开发者完成一个类 3、声明私有方法 4、模仿多继承等
通过运行时给分类添加属性:
@interface NSObject (SpecialName)
@property (nonatomic, copy) NSString *specialName;
@end
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *SpecialNameKey = &SpecialNameKey;
@implementation NSObject (SpecialName)
@dynamic specialName;
- (NSString *)specialName {
//如果属性值是非id类型,可以通过属性值先构造OC的id对象,再通过对象获取非id类型属性
return objc_getAssociatedObject(self, SpecialNameKey);
}
- (void)setSpecialName:(NSString *)specialName{
//如果属性值是非id类型,可以通过属性值先构造OC的id对象,再通过对象获取非id类型属性
objc_setAssociatedObject(self, SpecialNameKey, specialName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
类扩展(Extension)
1、类扩展是分类的一个特例(Extension 是 Category 的一个特例) ,也称作匿名分类
2、可以给类添加成员属性,但是是私有变量
3、可以给类添加方法,也是私有方法 (添加的方法一定要实现,Category 中的方法可以不实现)
4、一般情况下,Extension 是放在.m文件的@implementation 的上方
注:Extension 中的方法必须在@implementation中实现,否则会编译出错
分类(Category) 和 类扩展(Extension) 的区别:
Extension:
1、在编译期间决议,是类的一部分,在编译器和头文件的@interface和实现文件里的@implement一起形成一个完整的类
2、伴随着类的产生而产生,也随着类的消失而消失
3、Extension 一般用来隐藏类的私有信息,必须有一个类的源码才能添加一个类的Extension ,所以对于系统的类,是无法添加类扩展
Category:
1、是运行时决议的
2、类扩展可以添加实例变量,分类不能添加实例变量,因为在运行时期间,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局