美文网首页
iOS-weak修饰的对象被释放时,weak指针自动被置为nil

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

作者: JackSteven | 来源:发表于2019-12-05 19:32 被阅读0次

我们都知道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

相关文章

  • 被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道

    被weak修饰的对象在被释放的时候会发生什么? 1.被weak修饰的对象在释放时,weak指针会自动被置为nil。...

  • __weak简析

    当一个 __weak 类型的指针指向的对象被释放时,该指针会自动被置成nil,因此__weak关键字修饰的指针又被...

  • iOS __weak的底层实现

    1.为什么要使用weak关键字修饰对象 因为使用weak修饰的对象在对象释放的时候,引用它的指针会自动被置为nil...

  • weak的底层的实现

    1.为什么要使用weak关键字修饰对象 因为使用weak修饰的对象在对象释放的时候,引用它的指针会自动被置为nil...

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

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

  • weak与assign的区别

    weak与assign的唯一区别在于,当指向的对象被释放掉之后,weak指针会自动置为nil。而assign指针会...

  • iOS中的weak

    weak和assign的区别: weak是在对象被释放后自动置为nil的,所以不会出现野指针;而assign并不会...

  • OC--看objc源码认识weak

    weak修饰有什么用? 声明为weak的指针,weak指针指向的对象一旦被释放,weak的指针都将被赋值为nil ...

  • 给自己出的iOS面试题

    面试题: weak修饰的对象如何被自动置为nil? strong修饰的对象在引用计数变为0时,是实时销毁的吗? a...

  • iOS weak指针置nil具体过程

    先看一下delloc的具体实现: dealloc的实现 weak指针置nil 当weak引用指向的对象被释放时,我...

网友评论

      本文标题:iOS-weak修饰的对象被释放时,weak指针自动被置为nil

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