首页 > 其他分享 >iOS - Runtime - Class-方法缓存(cache_t)

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

时间:2024-03-27 23:33:49浏览次数:21  
标签:缓存 mask cache iOS 列表 索引 key Runtime 方法

文章目录

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

标签:缓存,mask,cache,iOS,列表,索引,key,Runtime,方法
From: https://blog.csdn.net/sharp521/article/details/137061713

相关文章

  • iOS - Runtime-消息机制-objc_msgSend()
    iOS-Runtime-消息机制-objc_msgSend()前言本章主要介绍消息机制-objc_msgSend的执行流程,分为消息发送、动态方法解析、消息转发三个阶段,每个阶段可以做什么。还介绍了super的本质是什么,如何调用的1.objc_msgSend执行流程OC中的方法调用,其实都是转换为objc_msgSend函......
  • npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3
    在使用npm时,有时候您可能会遇到类似以下错误的权限问题:npmERR!path/Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3npmERR!codeEACCESnpmERR!errno-13npmERR!syscallopennpmERR!Error:EACCES:permissiondenied,open'/Users/apple/......
  • http协议中缓存Cache-Control详解
    Cache-Control是一个HTTP/1.1协议中的头部字段,用于指定请求和响应遵循的缓存机制。通过这个头部,服务器可以告诉客户端响应可以被缓存多长时间,以及在什么条件下可以被缓存和重新使用。以下是一些常见的Cache-Control指令:基本指令no-cache表示响应不应该被缓存,除非得到......
  • 【全开源】JAVA海外短剧国际版源码支持H5+Android+IOS_博纳软云
    &nbsp;&nbsp;&nbsp;在数字化快速发展的今天,海外短剧市场日益繁荣,成为了全球娱乐界的新宠。为了满足广大用户的需求,我们推出了一款基于JAVA开发的海外短剧国际版源码,支持H5、Android和IOS三大平台,让您轻松进军海外短剧市场。这款源码采用了JAVA语言进行开发,具有高度的可定制......
  • 【全开源】JAVA海外短剧国际版源码支持H5+Android+IOS_博纳软云
    &nbsp;&nbsp;&nbsp;在数字化快速发展的今天,海外短剧市场日益繁荣,成为了全球娱乐界的新宠。为了满足广大用户的需求,我们推出了一款基于JAVA开发的海外短剧国际版源码,支持H5、Android和IOS三大平台,让您轻松进军海外短剧市场。这款源码采用了JAVA语言进行开发,具有高度的可定制......
  • 【全开源】JAVA海外短剧国际版源码支持H5+Android+IOS_博纳软云
    &nbsp;&nbsp;&nbsp;在数字化快速发展的今天,海外短剧市场日益繁荣,成为了全球娱乐界的新宠。为了满足广大用户的需求,我们推出了一款基于JAVA开发的海外短剧国际版源码,支持H5、Android和IOS三大平台,让您轻松进军海外短剧市场。这款源码采用了JAVA语言进行开发,具有高度的可定制......
  • 指令cache一致性
    指令cache一致性​​N2alsogetsoptionalhardwareinstructioncachecoherency.ARMrecommendsenablingitonsystemswithalotofcoresbecausebroadcastingsoftware-issuedinstructioncacheinvalidateswouldnotbescalable.Toimplementinstructionca......
  • uniapp开发iOS——Xcode无法运行到运行真机提示 Executable Path is a Directory
    软件版本:Xcode14模拟器型号:Apple14Pro真机型号:Apple6sPlus异常描述:模拟器都能正常运行,Apple6sPlus运行就报错如下:解决方法:TARGET->BuildSettings->Architectures->ExcludeArchitectures里面把arm64都删掉,重新building就好了。注:删除这两个配置的时候双击会出现......
  • System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3
    VS2022.netCore5.0项目编译没问题,运行时报这个错System.IO.FileNotFoundException:“Couldnotloadfileorassembly'System.Runtime,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'.系统找不到指定的文件。” 我这里遇到这个问题的原因是,v......
  • iOS组件化开发之私有库
    0、了解iOS组件化1、制作开源组件库预备工作:1、安装cocoapods2、准备github账号,gitee账号,和cocoapod账号其中github,gitee账号直接在线创建即可。而注册cocoapods账号需要的终端命令:[email protected]"xxx"然后在邮箱里找到验证链接,登录一下即可。podtrunk......