OC-类的结构-bits

2020-12-09 10:18:51 浏览数 (1)

类的结构

struct objc_class : objc_object{

// Class ISA 8bytes

Class superclass 8bytes

cache_t cache 16bytes

class_data_bits_t bits

````

}

但仅仅源码层面还不足以知道类的结构。那么通过在类里添加属性以及clang 编译出源c代码

clang -x objective-c -rewrite-objc -issysroot /Application````/iPhoneSimulator.sdk

得到main.cpp

static struct { //method_list_t 这是类结构之一

method_count

entsize

struct _objc_method method_list[8] //8取决于有多少个成员变量以及属性

}_OBJC_$_INSTANCE_METHODS_CLASS __attribute__ ((used,section("__DATA,__objc_const")))={

sizeof(_objc_methond),

8,

{{(struct objc_selector *"class_method such as name age date nickName","@16@0:8",(void *)_I_Person_nickName},

{{(struct objc_selector *" date","v16@0:8",(void *)_I_Person_date},

}

不难发现类的成员变量以及属性,会通过一个构造函数 struct objc_selector传入三个参数1.sel名字 2.大小 3._I_所在类的名字_变量名字 _I_CLASS_age/name/nickName/setName

@16@0:8

第一个@:返回值 id,

16代表公共字节,

第二个@代表第一个参数8大小,

0: 从零开始

那么我们通过Xcode的LLDB窗口得到Class的地址

p/x Study.class = $0

强转

p (class_data_bits_t *) $0

p $1->data() 这里开了上帝视角

(class_rw_t *)$2

p $2->methods

(const method_array_t)$3

p $3.list

p *$4

p $5.get(0)

探索止步

注释:OC里成员变量和属性的区别在于 属性底层声明时变量会增加“_”符号,以及set get方法,而成员变量没有。(我也不记得这个注释是哪里来的,莫名出现在笔记本上)

0 人点赞