ARC和Runtime
2020-03-24 本文已影响0人
无敌大闸蟹
ARC
ARC 编译器会自动插入对应的代码,再结合Objective C的runtime,实现自动引用计数
retain的过程 —— 获取全局的map( 叫做sideTable 对象的地址为key 引用计数的值为value ) 加锁 引用计数器 + 1 解锁
release —— 查找map,对引用计数减1,如果引用计数小于阈值,则调用dealloc
((void(*)(objc_object *, SEL))objc_msgSend)(this, SEL_dealloc)
autorelease ———把对象存储到AutoreleasePoolPage的链表里。等到auto release pool被释放的时候,把链表内存储的对象删除,所以AutoreleasePoolPage就是自动释放池的内部实现
weak 有个全局的map 对象的地址为key weak修饰的对象的地址是value 对象释放后 根据对象的地址可以找到对应的weak引用的地址,将其置为nil
block也是对象 背后的内存模型实际上是一个结构体,这个结构体会存储一个函数指针来指向block的实际执行代码
Runtime
Selector ——C的字符串
SEL 指向Selector的指针
IMP 指向函数体的函数指针
Method 指向OC方法的指针 包含 { SEL:methodname IMP:method_imp }
通过isa找到类 (类方法是找到类元metaClass)其中有SEL:IMP的表(method_list里面Method) 通过sel找到imp执行