使用场景:
1、为已经存在的类添加方法;
2、将类的实现分开在几个不同的文件里面。(减少单个文件体积,不同的功能组织到不同的category里,多个开发者可以共同完成一个类,按需加载想要的category)
3、声明私有方法;
4、模拟多继承;
5、把framework的私有方法公开。
extension和category:
category(分类):
1、category可以给类(包括系统自带类)扩展方法;
2、只能添加方法,不能直接添加成员变量;
3、分类的优先级高于当前类,即会优先调用分类中的方法。
4、如果存在多个分类,都实现了相同的方法,将会根据:targets,Build Phases,Complie Source自上而下执行;
5、声明的方法可以不实现;
6、在运行期决议;(由于category在运行期才能决议,而变量在编译期就需要确定布局,所以category不能添加变量)
extension(类扩展):
1、extension也叫作匿名分类,为一个类添加私有的成员变量和方法;
2、类扩展可以定义在.h文件中,定义后的变量是共有的,也可以定义在.m文件中,定义后的变量是私有的;
3、一旦声明方法必须实现;
4、在编译期决议,伴随类的产生而产生,消亡而消亡,它是类的一部分
数据结构:
category数据结构包含:
1、类名(name)
2、类(cls)
3、添加到类中的实例方法列表(instanceMethods)
4、添加到类中的类方法列表(classMethods)
5、实现的协议列表(protocols)
6、添加到类中的属性(instanceProperties)
加载过程:
1、把category的实例方法、协议以及属性添加到类上;
2、把cate的类方法和协议添加到类的metaclass上
注意:
1、category的方法没有“完全替换”原来类已经有的方法,而是在方法列表里放置两个相同的方法;
2、category添加的方法会排在类的新方法列表(原有列表+category添加列表)之前,而原有列表中的方法会放在后面,在查找方法时,会顺序查找,一旦找到则直接调用,不会继续寻找。
加载顺序:
1、如果category中都添加了+load方法,那么在类中可以调用category中声明的方法,因为附加category到类的工作先于+load方法的执行;
2、+load执行的顺序是先类,后cate的。其中,category的+load执行顺序是根据编译顺序决定的(所以可以通过调整编译顺序,决定category的执行顺序)。
3、“覆盖方法”执行顺序跟+load的执行顺序正好相反,程序会先从最后一个编译的category中寻找对应方法。
越过category调用原方法:
关联对象:
变相的为category添加属性,这个属性的创建、存储、销毁都由runtime执行。
添加关联属性 实现关联
网友评论