iOS--ARC自动引用计数及weak弱引用管理

2021-03-12  本文已影响0人  mayuee

ARC自动引用计数

弱引用管理

__weak 修饰的 弱引用指针weakObj 引用了 alloc 的 obj:

{
    id obj = [id alloc] init];
    id __weak weakObj = obj;
}

编译后

{
    id weakObj;
    objc_initWeak(&weakObj, obj);
}

添加 weak 变量
objc_initWeak() ----> storeWeak() ----> weak_register_no_lock()
id
weak_register_no_lock(weak_table_t *weak_table, id referent_id,
id *referrer_id, bool crashIfDeallocating)
里面最终会传入了原对象 和 弱引用变量。函数会先通过原对象指针在弱引用表中通过哈希查找这个对象是否存在弱引用数组,如果这个弱引用数组存在,则在数组中添加这个弱引用变量。如果不存在,则创建这个数组,将弱引用变量添加到数组,并将数组添加到弱引用表中。

清除 weak 变量,weak 变量是如何置为 nil 的
清除 weak 变量时,同事设置为 nil 。
dealloc() -----> ....... -----> weak_clear_no_lock()
weak_unregister_no_lock(weak_table_t *weak_table, id referent_id,
id *referrer_id)
先在弱引用表中哈希查找这个被dealloc的对象是否存在弱引用数组,如果不存在,则不存在弱引用,不作处理。如果存在弱引用数组,则循环将弱引用指针置为 nil。

上一篇 下一篇

猜你喜欢

热点阅读