ToB企服应用市场:ToB评测及商务社交产业平台

标题: weak的底层原理 [打印本页]

作者: 花瓣小跑    时间: 2024-6-11 17:17
标题: weak的底层原理

weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被开释时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。
弱引用表(Weak Table)的键和值

   明白弱引用表的键和值对于明白 weak 引用的底层机制非常紧张。下面我具体表明一下这两个概念,并用示例和图表来阐明。
  键(Key)


值(Value)


具体示例

示例代码

  1. Person *personInstance = [[Person alloc] init];
  2. __weak Person *weakPerson1 = personInstance;
  3. __weak Person *weakPerson2 = personInstance;
复制代码
在这个示例中:

弱引用表表现

  1. Weak Table:
  2. +-------------------+-------------------+
  3. | Object Pointer    | Weak Reference(s) |
  4. +-------------------+-------------------+
  5. | 0x1000            | [0x2000, 0x3000]  |  // personInstance is referenced by weakPerson1 and weakPerson2
  6. +-------------------+-------------------+
复制代码
在这个弱引用表中:

对象开释时

当 personInstance 的引用计数变为零,体系预备开释该对象时,运行时会执行以下操纵:
  1. Weak Table (before release):
  2. +-------------------+-------------------+
  3. | Object Pointer    | Weak Reference(s) |
  4. +-------------------+-------------------+
  5. | 0x1000            | [0x2000, 0x3000]  |
  6. +-------------------+-------------------+
  7. Weak Table (after release):
  8. +-------------------+-------------------+
  9. | Object Pointer    | Weak Reference(s) |
  10. +-------------------+-------------------+
  11. | (nil)             | [nil, nil]        |  // personInstance 已被释放,weakPerson1 和 weakPerson2 被置为 nil
  12. +-------------------+-------------------+
复制代码
关键函数

在实现弱引用机制时,运行时体系利用以下关键函数:
   libobjc 中的一系列 API
   概述

弱引用表的键是被引用对象的内存地址,而值是一个集合,包罗了所有指向该对象的弱引用指针的地址。当对象被开释时,运行时会在弱引用表中找到所有指向该对象的弱引用,并将它们置为 nil,然后删除对应的条目。通过这种机制,iOS 保证了 weak 引用的安全性和可靠性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4