美文网首页
weak的底层实现原理?

weak的底层实现原理?

作者: 拉布拉熊 | 来源:发表于2018-03-29 10:50 被阅读0次

    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的底层实现原理?

          本文链接:https://www.haomeiwen.com/subject/gnbycftx.html