OC-类的内存结构-cache

OC-类的内存结构-cache

IOS小彩虹2021-08-01 3:49:53390A+A-

一·如何找到内存的结构
所有的一切都建立在苹果开源的源码上,所以明白我们研究的是什么,类-class

oc里的类统统都来自一个结构体 objc_class

以这个为切入点,我们可以尝试在源码层搜索objc_class {

image.png

二·关键词
方法论:由于内存结构代码量太大

cache_t 的结构长达200多行,若干个相关变量

那么楼主打算从每个关键词出发从"点-线-面"的思维方式来研究对象。(既从微观研究到宏观,然后得出一个整体思路)

理解这一点很重要,不然会看不懂接下来贴了一大堆的图片究竟是为了什么。

1._maskandBucketsmask_t

2.maskuint_16_t _flagsmask16_t
3.-occupied
4.struct bucket_t buckets()

image.png

5.mask_t mask()

image.png

6.mask_t occupied()

image.png

7.void incrememtOccupied()

image.png

8.capacity()

image.png

9.rellocate()

image.png

image.png

ps;iOS开发交流技术群:欢迎你的加入,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长

为newCapacity calloc一片空间

image.png

释放旧bucket,赋值新的bucket,执行缓存回收函数

garbage 通常会把data数据放在寄存器的x16 x32类似的位置来处理,而不会放在高位x0等等,防止x0~x8有数据。

10.insert()

image.png

image.png

那么insert函数做了以下几件事情
1.初始化occupied()+1

2.判断容量大小

3.设置缓存的哈希头标识index

image.png

4.判断缓存的下一个节点是否是begin头 如果是给bucket的sel和imp赋值

image.png

初始化occupied=0

image.png

释放缓存

三·化元归一(总结)
1.从objc_class得到cache_t
2.在真机下cache_t拥有者若干有用变量及函数
3.maskandBuckets 是通过逻辑位运算合并到一块的,目的是为了节约内存
4.缓存判断会先经过cache_fill 填充判断(Never cache before + initialize is done)
5.缓存插入会计算当前缓存占用数量既occupied+1
6.判断缓存大小会有三个不同的分支
6.1分支一:若容量小于3/4什么都不做
6.2分之二:若容量为默认则进入到申请内存空间步骤
1.allocatedBucket()

                2.setBucketsAndMask:根据newMask <<maskShift | newBuckets

                3.occupied=0

                4.如果有旧的bucket,执行释放缓存garbage_make_room & garbage_refs[garbage_count++]=data

      6.3分支三:若容量大于3/4会进行三目运算判断扩容 :cap=cap?cap*2 :init_cache_size
      6.4分支四:针对这一次要存储的bucket进行内部的sel和imp赋值 既赋值操作从x30后开始,保留x0~x8

7.缓存cache_t中最重要的一点思想就是:"扣"。苹果为了节约内存甚至把bucket和mask合并到了一起
从而2-1的maskandbucket是缓存cache结构当中的点睛之笔。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们