iOS 简单理解分类(category)和类扩展(extensi
2019-08-26 本文已影响0人
kindom_0129
- 类别(category):
1.类别不能为已存在的类添加实例变量。
2.类别中添加的方法优先级高,会覆盖原类中的方法
3.原类中的私有方法,可以在类别中定义一下,这样就可以使用了。
4.在categroy中定义的方法可以被子类继承。
- 扩展(extension)
1.扩展中可以定义属性,变量,和方法
2.扩展中定义的属性和方法不能被子类继承
3.扩展中只能对自定义的类添加方法,不能对系统类添加方法。
extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。 extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。(官方文档)
但是category则完全不一样,它是在运行期决议的。 就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。