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

news/2024/7/20 23:05:33 标签: iOS

文章目录

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

iOS__Runtime__Classcache_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.niftyadmin.cn/n/5452997.html

相关文章

2014年认证杯SPSSPRO杯数学建模A题(第一阶段)轮胎的花纹全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 A题 轮胎的花纹 原题再现&#xff1a; 轮胎被广泛使用在多种陆地交通工具上。根据性能的需要&#xff0c;轮胎表面常会加工出不同形状的花纹。在设计轮胎时&#xff0c;往往要针对其使用环境&#xff0c;设计出相应的花纹形状。   第一阶段问…

k8s系列之十七 Istio中的服务治理

删除前面配置的目的地规则 [rootk8s-master ~]# kubectl delete destinationrule details destinationrule.networking.istio.io "details" deleted [rootk8s-master ~]# kubectl delete destinationrule productpage destinationrule.networking.istio.io "pr…

docker 安装 kibana

使用Docker安装Kibana相对简单且易于管理。以下是使用Docker安装Kibana的基本步骤&#xff1a; 安装Docker&#xff1a; 确保你的CentOS系统上已经安装了Docker。如果没有&#xff0c;请按照以下命令安装&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-…

js实现拖放效果

dataTransfer对象 说明&#xff1a;dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性&#xff0c;所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部&#xff0c;可以使用这个对象的属性和方法实现拖放功能…

javaWeb健康管理系统

一、引言 1.1 设计背景 紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检&#xff0c;教职工人入职体检&#xff0c;以及所有学生和教职工的定期体检…

谷粒商城——缓存——SpringCache

1. 配置使用 首先需要导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 随后在配置文件中进行配置&#xff1a; spring:cache:t…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件&#xff0c;这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

Python 从0开始 一步步基于Django创建项目(8)使用表单编辑既有条目

与《Python 从0开始 一步步基于Django创建项目&#xff08;6&#xff09;》中的表单应用不同。 前者&#xff0c;是使用表单&#xff0c;提交新数据&#xff0c;新增内容。 本文&#xff0c;是使用表单&#xff0c;对既有数据&#xff0c;进行修改。 因为是对既有数据进行修…