当前位置: 首页 > news >正文

iOS - Runtime - Class-方法缓存(cache_t)

文章目录

  • iOS - Runtime - Class-方法缓存(cache_t)
      • 1. 散列表的存取值

iOS - Runtime - Class-方法缓存(cache_t)

Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高方法的查找速度。(使用空间换时间的方式来提升速度)

其中,_buckets就是散列表_mask表示散列表的长度-1

哪一个类对象调用的方法,会把该方法缓存到这个类对象。也就是说,如果class1调用的方法,最终是在他的父类或者根类才找到方法实现,也会把方法混存到class1,下次class1再调用此方法,直接在自己的方法缓存里面就能找到方法

当前类查找,或者当前类没找到继续到父类或者跟根类,查找,都是优先缓存里面查找,缓存没找到再到方法列表里面去查找

1. 散列表的存取值

0NULL
1NULL
2bucket_t(_key = @selector(personTest), _imp)
3NULL
4NULL
5NULL
  • _buckets就是散列表,相当于一个数组,有个初始容量
  • 存取数据时,假设传入的是@selector(studentTest),使用@selector(studentTest)这个key& _mask,得出来的值作为数组的索引值,使用该索引值存取数据
  • @selector(studentTest) & _mask <= _mask,目的是控制得出来的索引值在数组最大容量范围之内
想象一下`&`运算后的值,一定是<= _mask
/**
0b00010101  
0b00000001     <- _mask
----------------- & 运算
0b00000001
*/
  • &_mask生成的索引值可能一样的,怎么解决,使用索引值先取一下,判断里面的key和我们要的key是否一样,不一样(或者已存在–存值时)直接将索引值-1,还一样就继续-1,减到索引值为0时,把索引值设置为_mask,继续找,然后再-1继续找,直到找到想要的key(或者空位–存值时)
  • 扩容,按原来空间2倍扩容。扩容的时候,会将缓存清掉,因为_mask的值已经变了

@oubijiexi

http://www.lryc.cn/news/328429.html

相关文章:

  • 2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序
  • 【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码
  • Unity中控制帧率的思考
  • 阿里云子域名配置,且不带端口访问
  • C#-ConcurrentDictionary用于多线程并发字典
  • 深入探讨多线程编程:从0-1为您解释多线程(下)
  • 深度学习pytorch——减少过拟合的几种方法(持续更新)
  • 排序第五篇 归并排序
  • 【Win】使用PowerShell和Webhooks轻松发送消息至Microsoft Teams
  • ESCTF-OSINT赛题WP
  • 2024蓝桥杯省赛保奖突击班-Day2-前缀和、差分、尺取_笔记_练习题解
  • C++基础之虚函数(十七)
  • 快速入门Kotlin①基本语法
  • 【理解指针(四)】
  • Ribbon简介
  • 【感悟《剑指offer》典型编程题的极练之路】02字符串篇!
  • 通过 Docker 实现国产数据库 OpenGauss 开发环境搭建
  • 【Java】LinkedList模拟实现
  • ubuntu下mysql常用命令
  • 燃气官网安全运行监测系统-阀井燃气监测仪-旭华智能
  • vue 文件预览(docx、.xlsx、pdf)
  • 云架构(二) 大使模式
  • .NET Path类库的特殊方法
  • 【JVM】JVM常用性能调优参数详细介绍
  • React中的受控组件与非受控组件
  • uniapp实现u-datetime-picker时间选择器的默认日期定位,解决default-value不生效问题
  • react native 使用ScrollView实现下拉更新,上拉加载更多
  • vue2完结
  • 前端网页之间传递参数
  • 【常见面试题】Golang中,协程数最多可以开多少个?