美文网首页
category(Class扩展)

category(Class扩展)

作者: c7e21c9a20c5 | 来源:发表于2016-12-14 11:58 被阅读75次

使用场景:

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执行。

添加关联属性 实现关联


原文章:深入理解Objective-C:Category

相关文章

网友评论

      本文标题:category(Class扩展)

      本文链接:https://www.haomeiwen.com/subject/cthbmttx.html