12.05-dealloc weak表

2024-01-28 05:18
文章标签 weak 12.05 dealloc

本文主要是介绍12.05-dealloc weak表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 1. -dealloc
        • 1. _objc_rootDealloc
        • 2. rootDealloc
        • 3. object_dispose
    • 在这里插入图片描述
        • 4. objc_destructInstance
        • 5. clearDeallocating()
        • 6. clearDeallocating_slow
          • 1. weak 表
            • 1. weak_clear_no_lock


引用计数可以直接存储在优化过的isa指针中,当引用过多,就会存储在Side Table中
在这里插入图片描述
refcnts : 存放着引用计数的散列表


1. -dealloc

  • dealloc 方法中会调用_objc_rootDealloc

引用计数为0
在这里插入图片描述


1. _objc_rootDealloc

执行rootDealloc()
在这里插入图片描述


2. rootDealloc

如果被弱引用过,有过关联属性等,就执行object_dispose
在这里插入图片描述


3. object_dispose

在这里插入图片描述

4. objc_destructInstance

在这里插入图片描述


5. clearDeallocating()

在这里插入图片描述


6. clearDeallocating_slow

从SideTables 这个总表中获取一张 SideTable类型的表 table
表table中删除引用计数 和 weak
在这里插入图片描述


1. weak 表
1. weak_clear_no_lock

在这里插入图片描述


  1. 有a,b,c 三个对象弱引用了obj1,当obj1被释放了
  2. 在SideTables这个表中,以obj1的地址哈希后的值为key,找到一张SideTable
  3. 这个SideTable有一个自旋锁,当对着个表进行操作的时候,就会加锁

为什么会有多张SideTable,而不是一张?
从这个自旋锁可以推断出,如果只有一张表,那么如果同时有很多对象释放时,这个锁的作用,就相当于是单线程,一次只能释放一个对象.
那如果是多张表,那么很多对象释放的时候,多张表,多个锁,可以同时释放多个对象.

  1. 在SideTable这个表中,以obj1的地址哈希后的值为key,找到weak_table_t
  2. weak_table_t 里就存着 a,b,c 这三个对象的地址, 把这三个对象的值都置为nil

在这里插入图片描述

这篇关于12.05-dealloc weak表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/652572

相关文章

C++-标准库 weak_ptr

文章目录 概述构建cyclic reference例子 概述 shared_ptr的作用主要是在最后一个指向资源的shared_ptr销毁时自动释放资源,然而在某些场景下这种行为可能不被期望。例如: 两个或者多个对象都使用shared_ptr,并且相互通过shared_ptr指向对方,如果存在一个环路(cyclic reference),那么由于环路上的shared_ptr的u

[4 使用C++11解决内存泄漏问题] 4.1 shared_ptr / 4.2 unique_ptr / 4.3 weak_ptr

智能指针是存储指向动态分配(堆内存)对象指针的类。 通用实现技术是使用引用计数。每使用它一次,引用计数加1,每析构一次,引用计数减1,减为0时,删除所指向的堆内存。 C++11提供三种智能指针,std::shared_ptr,std::unique_prt和std::weak_ptr。需引用头文件。 4.1 shared_ptr共享的智能指针 shared_ptr使用引用计数,每一个s

浅析objective-c中的strong和weak

在才开始学习oc时,搞不懂什么时候用strong,什么时候用weak,经过一段时间的学习,我谈谈我对strong和weak的理解。 首先strong和weak这两个关键字是用来修饰变量,表示这个变量是强(strong)引用和弱(weak)引用 我们在程序中经常会用到“[[class alloc]init]” 这样的代码,我想你对它已经很熟。这是在开辟一块内存,并初始化。那么系统开辟了这块内

association weak 属性

association weak 属性 当给类添加分类添加属性时,我们一般使用关联对象来实现 管理关联对象的方法: objc_setAssociatedObject(id object, void * key, id value, <objc_AssociationPolicy policy) 以给定的key为对象设置关联对象的value objc_getAssociatedObject(i

Xcode7.3g更新后__weak错误解决方法

解决方法 Xcode更新后,使用__weak会提示 经查询发现解决方法 具体步骤 工程 – build Setting -> 搜MRR将搜索结果(Manual Retain Release) 改成 Yes 即可

ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题

http://www.dahuangphone.com/dispbbs.asp?boardid=8&replyID=213&ID=85&skin=1 ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题 由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃, 在非ARC情况下, 我们要返回一个Block ,需要

OC内存管理retainCount,dealloc

main.m // insert code here.../*内存管理*///1.为什么要管理内存?//OC动态语言,需要内存否则会造成内存泄露,一定规模后会造成程序的崩溃//OC中引入了计数(retainCount),判定对象是否应该被销毁,并回收内存//2.管理内存的方法//手动内存管理//自动引用计数(ARC = Automatic reference counting)/*关灯例

Keil 编译器特有的功能 关键字和运算符 __weak

Keil> 编译器特有的功能 > 关键字和运算符 > __weak __weak 此关键字指示编译器弱导出符号。 可以将 __weak 关键字应用于函数和变量声明以及函数定义。 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器将未解析的引用作为错误处理。 例如: __weak void f(void); ... f(); //

1618 - Weak Key【贪心】【搜索】

题目大意样例 inputoutput解释 思路代码Hit 题目大意 传送门 给出n个case 每个case中有m个数字,对于每一组case,问是否存在4个整数 Np Nq Nr Ns (1 <= p < q < r < s <= k),使得 Nq > Ns > Np > Nr 或者 Nq < Ns < Np < Nr。 样例 input 3 6 10 30

ios __block与__weak

http://www.jianshu.com/p/d73772dc36a8其实这个问题在现在来说主要就是2个区别:block下循环引用的问题__block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil__weak可以避免循环引用,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个