美文网首页
OC中Category分析

OC中Category分析

作者: CicadaJZ | 来源:发表于2022-07-14 17:44 被阅读0次

分类的底层结构

struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods; // 对象方法
    struct method_list_t *classMethods; // 类方法
    struct protocol_list_t *protocols; // 协议
    struct property_list_t *instanceProperties; // 属性
    // Fields below this point are not always present on disk.
    struct property_list_t *_classProperties;

    method_list_t *methodsForMeta(bool isMeta) {
        if (isMeta) return classMethods;
        else return instanceMethods;
    }

    property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
};

实现原理

将方法、属性、协议数据保存在category_t的结构体中,然后将结构体中的方法列表拷贝到类对象的方法列表中

为什么不能添加成员变量

Category中可以添加属性,但不会帮我们生成成员变量,只会生成get、set方法的声明,需要我们手动去实现。因为category_t的结构体里面是不存在成员变量的。成员变量是保存在实例对象中的,成员变量的查找是通过地址偏移,而对应的偏移是在编译的那一刻就已经确定好的,而category是在运行时。因此我们就无法在运行时将Category中的成员变量添加到实例对象的结构体中。

Category中有load方法吗?是什么时候调用的?能继承吗?

有;程序启动装载类信息的时候调用的;能继承,但是在调用子类的load方法之前,会先调用父类的load方法。

load&initialize的区别,以及它们在Category重写时的调用次序。

load:
调用方式:通过load方法的内存地址直接调用load方法
调用时刻:runtime加载类、分类的时候调用,只会调用一次
调用顺序:调用load之前会先调用父类的load方法,分类中的load方法不会覆盖本类的load方法,先编译的分类优先调用load方法。

initialize:
调用方式:通过objc_msgSend调用
调用时刻:类第一次接收到消息的时候调用,类的initialize只会调用一次,父类的initialize可能会调用多次
调用顺序:initialize先初始化父类再初始化子类,如果子类没有实现initialize,会调用父类的initialize,所以父类的initialize可能会被多次调用,如果分类实现了initialize,就覆盖类本身的initialize。

相关文章

  • 结合 category 工作原理分析 OC2.0 中的 runt

    结合 category 工作原理分析 OC2.0 中的 runtime 结合 category 工作原理分析 OC...

  • OC中Category分析

    分类的底层结构 实现原理 将方法、属性、协议数据保存在category_t的结构体中,然后将结构体中的方法列表拷贝...

  • 分类、类扩展与继承

    在OC中,扩展一个类的方式有两种,继承和分类。 分类(Category) 概念 分类(Category),是OC中...

  • OC中的Category(三)

    OC中的Category(三) OC中+initialize函数加载和调用 OC对象是在查找方法时判断自己有没有初...

  • 二、oc中 Category的原理分析

    分类的底层结构 分类中的对象方法依然是存储在类对象中的,同本类对象方法在同一个地方,调用步骤也同调用对象方法一样。...

  • swift中Extension的简单理解

    swift中的extension和OC中的Category有点类似,同时也比category的功能更加的强大,想e...

  • iOS底层原理总结 -- 利用Runtime源码 分析Categ

    iOS底层原理总结 -- 利用Runtime源码 分析Category的底层实现 窥探iOS底层实现--OC对象的...

  • OC 中的 category

    在谈category的时候,就需要对比的看下扩展。 扩展:编译的时候决定,一般来说 是声明 私有的属性和变量类别:...

  • OC中的Category

    注意:所有的分类方法都会被合并到class对象和meta-class对象中,不会覆盖掉原对象的方法。可以通过run...

  • Categroy方法覆盖原理

    在OC中可以通过Category给类添加属性、方法、协议。 本文不介绍怎样添加属性、方法和协议,我们来分析一个相关...

网友评论

      本文标题:OC中Category分析

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