weak
经过编译会调用以下两方法,
objc_initWeak
storeWeak
weak_register_no_lock
在内部先通过操作后(如判空、deallocating、isTaggedPointer),调用
weak_entry_for_referent获取 weak_entry_t (内部通过哈希查找&散列表的mask得到index,从弱引用表entiries[index]内取出地址和目标做比较,相等就直接返回,不等就index+1,继续往下偏移计算。)
类型的结构体entry,若有就把新的弱引用指针添加进入该结构体内的referrers或inline_referrers数组内;否则就新创建个
weak_entry_t 结构体类型,然后把弱引用指针加入结构体内部的可变数组内。这样也就加入到弱引用列表内了。
dealloc
_objc_rootDealloc
rootDealloc
经过一些列判断,如是否有关联对象、析构函数、非指针型isa、弱引用指针、散列表等,如无,调用c的free释放,结束。如有
调用object_dispose,内部调用objc_destructInstance将关联对象、析构函数移除掉。再调用clearDeallocating,再其内调用
weak_clear_no_lock,其内部先调用
weak_entry_for_referent获取 weak_entry_t (,内部通过哈希查找&散列表的mask得到index,从弱引用表entiries[index]内取出地址和目标做比较,相等就直接返回,不等就index+1,继续往下偏移计算。)
类型的结构体entry,根据entry计算出元素个数,拿出可变数组,遍历可变数组,判断该数组内的弱引用指针是否和当前目标对象地址一致,一致就将该遍历出来的指针置为nil