类别 扩展 继承
继承:一个类(子类)继承于另一个类(父类),那么子类不仅拥有父类所有的属性和方法,而且可以创建属于自己的属性和方法。
扩展(extension):不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的( 作用范围只能在自身类,而不是子类或其他地方)。
分类(category): 只能添加方法,不能添加属性,因为分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告)。
可以在分类中访问原有类.h中的属性,分类是给原有类添加方法的,在分类的结构体指针中,没有属性列表,只有方法列表,原则上不能添加属性,实际上可以通过其他方式添加(通过runtime解决没有setter/getter的问题)。
如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类
扩展和分类区别:
extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡
category则完全不一样,它是在运行期决议的。 就category和extension的区别来看,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。
类扩展不能像分类那样拥有独立的实现部分 @implementaton 部分。也就是说,类扩展所声明的方法必须依托对应的类的实现部分来实现。