美文网首页
weak理解

weak理解

作者: 小人物_b | 来源:发表于2019-01-16 11:50 被阅读0次

创建weak对象obj1

NSObject *obj = [[NSObject alloc] init];
id __weak obj1 = obj;

weak 实现原理的概括

runtime维护一个weak表,用来存储某个对象的所有weak指针。weak表其实是一个hash表,key是对象的地址,value内部实现是一个weak_table_t的结构体,存储了某个对象相关的所有弱引用信息。


图片.png

weak 的实现原理可以概括一下三步:

图片.png

1、初始化时: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底层解析

相关文章

  • weak理解

    创建weak对象obj1 weak 实现原理的概括 runtime维护一个weak表,用来存储某个对象的所有wea...

  • 理解weak属性

    Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表...

  • weak 的理解

    为啥对象释放会变为nil

  • 0x003 理解iOS weak对象存储原理

    理解iOS weak对象存储原理 1、案例代码 分别声明__weak弱引用对象obj、obj1 2、分析__wea...

  • __weak和__strong关键字

    前言 关于__weak和__strong关键字,__weak关键字好理解,用它修饰本类的self,可以防止bloc...

  • weak的简单理解

    1.weak简述 weak表是一个hash表,key是所指对象的地址,value是所有指向这个对象的weak指针数...

  • iOS基础 对Strong和Weak的理解

    之前对Strong和Weak的理解并不够深,只知道Strong是强引用,对象的引用计数加一,weak是弱引用,防止...

  • iOS面试资料

    1. strong、retain、copy、assign、weak、_Unsafe_Unratain 关键字的理解...

  • Block、__weak、__strong本质理解

    前言 我承认我被网上很多的讲解误导了,导致我在做一些连贯性的思考时,思维走不通了。 不服气的我进行了一些深挖,因为...

  • weak_ptr lock 理解

    创建新的 std::shared_ptr 对象,它共享被管理对象的所有权。若无被管理对象,即 *this 为空,则...

网友评论

      本文标题:weak理解

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