美文网首页
11期_iOS-分类探究

11期_iOS-分类探究

作者: 萧修 | 来源:发表于2023-08-11 01:00 被阅读0次

    分类概念

    分类的特点:

    • 编译后的Category类,是没有将方法添加到宿主类的,是通过程序运行时依赖runtime动态添加到宿主类
    • 分类是给原有类添加方法,在分类的结构体指针中,是没有属性列表,只有方法列表
    • 分类可以写property,但是不会生成setter方法,也不会生成私有变量,会编译通过,引用报错
    • 分类中方法和原类方法冲突,会优先调用分类方法(分类的方法是最好添加到方法列表中)
    • 多个分类方法,由编译顺序决定,谁最后编译执行谁

    多个分类编译顺序(队列方式):Build Phases -> Compil Sources 列表中下面的Category文件比其上边的Category文件先加载运行
    分类中的instance方法合并到class对象中,类方法合并到meta-class对象中
    属性、instance方法、协议合并到类对象struct class_rw_t中
    通过attachCategories函数将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面

    initialize和load区别
    load是启动加载时刻runtime调用,
    1、调用顺序:load是函数地址调用,initialize是objc_msgsend调用;都是系统主动调用
    2、分类加载load方法,原类也会加载,先编译优先加载(只加载一次)。而initialize子类调用 再调用父类,父类会调用多次

    分类的底层结构

    struct category_t{
    const char *name;//分类名称
    classref_t cls;//所属原类
    struct method_list_t *instanceMethods;//实例方法列表
    struct method_list_t *classMethods;//类方法列表
    struct property_list_t *protocols;//协议方法列表
    struct property_list_t *instanceProperties;//实例属性列表
        
    }
    
    

    相关文章

      网友评论

          本文标题:11期_iOS-分类探究

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