objc-class:objc-object

Class superclass

cache_t cache

class_data_bits bits

class_rw_t *data(){

   return bits.data();

}

cache_t

struct bucket_t *buckets

mask_t   _mask

mask_t   _occupied

                      bucket_t


               cache_key_t _key

                IMP _imp

cache_t

class_ro_t

const char *name

method_list_t  *baseMethodList

protocol_list_t *baseProtocols

const ivar_list_t *ivars

const unit8_t   *weakIvarLayout

property_list_t  *baseproperties

class_rw_t

const class_ro_t *ro

method_array_t methods

property_array_t properties

protocol_array_t protocols

(class_rw_t *)(bits & FAST_DATA_MASK);

初始化过程是不存在的,只有稳定状态才有

method_array_t(二维数组)

list_array_tt<method_t, method_list_t> 

method_list_t

method_list_t0

method_t0

method_t1

method_list_t1

method_t0

method_t1

分类的方法在方法列表的前面

class自身的方法在表的后面(尾部)

外层数组method_arrary_t

内层数组method_list_t

内部元素method_t

method_array_t

method-t

SEL name

const char *types

IMP imp

*types

函数类型编码,通过字符串来表示类型,

即@encode指令。比如v@:即表达了一个

返回值为void,第一个参数为id类型,SEL

具体参考苹果文档

method_list_t

显然,这边的列表都是一维数组

class_ro_t当中存储的是类固有的信息

也就是@interface-@end之间的信息,可以

看到该结构体相对于class_rw_t结构体多了一个

const ivars,这也解释了为什么oc不可以动态

添加ivar,但是可以动态添加方法属性协议

Class结构

本图依据来源

objc4-723

test

test

2019-11-19 10:13:17 0 18
这里是评论

相关推荐