weak的底层实现原理?

1.何为weak?

weak 是oc中定义对象属性property时用于修饰对象属性的关键字。

2.weak有什么用处?

weak是弱引用,用weak修饰的对象计数器不会加1,并且在对象被释放时自动置为nil,大大避免了野指针访问导致崩溃的问题;另外weak还可用于解决delegate的循环引用;自定义的IBOutlet对象也使用weak(因为subviews数组已经对该对象进行了强引用,不需要再对其进行强引用了)。

3.weak的实现原理?

weak表是一个hash表,key指向对象的地址,value指向weak指针的地址数组(对象可能被多个weak指针弱引用);

runtime机制来维护这个hash表,详细步骤如下:

第一步:初始化时,runtime调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址;

第二步:添加引用时,objc_initWeak函数会调用objc_storeWeak函数更新指针的指向,创建对应的弱引用表;

第三步:释放时,调用clearDeallocating函数:根据key(对象的地址),找到对应的value(指向该对象的所有weak指针的地址数组),遍历这个数组,把所有的weak指针置为nil;最后删除weak表,清理对象记录.

当对象的引用计数为0时,调用dealloc函数,以对象的内存地址为key,到hash表中找到对应的存放weak指针地址的数组,遍历数组,并将weak指针置为nil;最后删除hash表,清理对象记录.

参考链接:http://www.cocoachina.com/ios/20170328/18962.html

你可能感兴趣的:(weak的底层实现原理?)