weak理解
2019-01-16 本文已影响0人
小人物_b
创建weak对象obj1
NSObject *obj = [[NSObject alloc] init];
id __weak obj1 = obj;
weak 实现原理的概括
runtime维护一个weak表,用来存储某个对象的所有weak指针。weak表其实是一个hash表,key是对象的地址,value内部实现是一个weak_table_t的结构体,存储了某个对象相关的所有弱引用信息。
图片.png
weak 的实现原理可以概括一下三步:
图片.png1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。先后调用a、weak_unregister_no_lock():用来解除weak指针的绑定b、weak_register_no_lock():添加与weak指针的绑定。
3、一个对象的引用计数变成0后会被释放。释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录
objc_clear_deallocating该函数的动作如下:
1、从weak表中获取废弃对象的地址为键值的记录
2、将废弃对象的weak指针地址,赋值为nil
3、将weak表中该记录删除
4、从引用计数表中删除废弃对象的地址为键值的记录
参考链接:
weak底层解析