美文网首页
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