分类 /扩展

//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

你可能感兴趣的:(分类 /扩展)