美文网首页
分类 /扩展

分类 /扩展

作者: 看谷秀 | 来源:发表于2019-10-19 21:12 被阅读0次
//Category表示一个结构体指针的类型
typedef struct objc_category *Category;

struct objc_category {
    char * _Nonnull category_name                            OBJC2_UNAVAILABLE;分类名称
    char * _Nonnull class_name                               OBJC2_UNAVAILABLE;//类名称
    struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE;//实例方法列表
    struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;//类方法列表
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;//协议列表
}                                                            OBJC2_UNAVAILABLE;

————————————————

//Class也表示一个结构体指针的类型
typedef struct objc_class *Class;

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE; 父类
    const char * _Nonnull name                               OBJC2_UNAVAILABLE; 类名
    long version                                             OBJC2_UNAVAILABLE; 版本
    long info                                                OBJC2_UNAVAILABLE; 信息
    long instance_size                                       OBJC2_UNAVAILABLE; 类实例变量大小
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;实例列表
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
————————————————

对比类定义发现,
分类没有定义
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;实例变量列表
long instance_size OBJC2_UNAVAILABLE; 类实例变量大小

分类:运行时决议,
类扩展:编译决议

1 为什么分类不能添加属性?
因为类的方法,属性变量,协议等,在编译时候内存结构已经确定了,
分类是运行时决议的,此时添加会破坏原有类的内存结构
分类在运行时候,会将分类信息合并到类信息中

2 类扩展怎么可以添加属性 变量
因为类扩展是编译决议,编译阶段 添加属性变量等就包含在类信息中了

3 为什么添加方法不会破坏原有类的内存结构,添加实例变量就会?
猜测哈 类中已经定义了实例变量及实例变量的大小,所以会破坏,其他的没发现 !!!

相关资料
https://cloud.tencent.com/developer/article/1495524
https://blog.csdn.net/lixuezhi86/article/details/81713166
https://blog.csdn.net/weixin_34380296/article/details/91471433

相关文章

  • iOS知识基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • IOS知识基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • 1. iOS面试题基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • iOS面试题-基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • iOS面试题--基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • 一些关键字的使用__weak,__block

    1、category 和 extension 的区别分类有名字,类扩展没有分类名字,是一种特殊的分类分类只能扩展方...

  • 分类 /扩展

    ———————————————— 对比类定义发现,分类没有定义struct objc_ivar_list * _N...

  • 扩展extension 面试问题

    扩展与分类的区别 扩展 只有声明 没有实现分类 有声明 有实现 分类 是运行时决议 扩展是编译时决议 系统可以添加...

  • iOS---12-load_images&类拓展&关联对象原理分

    类扩展 分类 类扩展就是一个匿名的分类.类扩展在编译的时候就将数据写入到类的信息中,也就ro中 分类编译底层是st...

  • Swift5.0 - day7-扩展、访问控制、内存管理

    一、扩展(Extension) 1.1、扩展介绍Swift中的扩展,有点类似于OC中的分类(Category)扩展...

网友评论

      本文标题:分类 /扩展

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