• iOS-weak修饰的对象被释放时,weak指针自动被置为nil的实现原理


    我们都知道weak指针不会增加引用计数,并在引用对象被回收的时候自动被置为nil。通常用于解决循环引用问题。那么,自动被置为nil内部又是如何实现的呢?

    一、weak的实现原理

    概括

    Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个哈希表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象的地址)数组。

    具体步骤

    1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

    2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数,objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。

    3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

    当weak引用指向的对象被释放时,如何去处理weak指针?

    1、调用objc_release

    2、因为对象的引用计数为0,所以执行dealloc

    3、在dealloc中,调用了_objc_rootDealloc函数

    4、在_objc_rootDealloc中,调用了object_dispose函数

    5、调用objc_destructInstance

    6、最后调用objc_clear_deallocating

    简单来说:

    a. 从weak表中获取被释放对象的地址为键值的记录

    b. 将包含在记录中的所有附有 weak修饰符变量的地址,赋值为 nil

    c. 将weak表中该记录删除

    d. 从引用计数表中删除废弃对象的地址为键值的记录

    参考链接: https://blog.csdn.net/xiaohuoziooo/article/details/88029300

  • 相关阅读:
    c# winform 读取图片列表
    C# 枚举显示中文
    onenote网页版如何打开链接弄到客户端
    the error code is 2203
    unknown software exception
    无法读取配置节“protocolMapping”,因为它缺少节声明
    oracle 索引失效原因
    向 mysql 插入汉字时报错 Incorrect string value: 'xE6x9BxB9xE5x86xAC...' for col....
    (二)Linux——Linux常用指令
    (一)Linux——Linux基本概念
  • 原文地址:https://www.cnblogs.com/hecanlin/p/13026296.html
Copyright © 2020-2023  润新知