//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
网友评论