36 | iOS 是怎么管理内存的?
戴铭
该思维导图由 AI 生成,仅供参考
你好,我是戴铭。今天,我来和你聊聊 iOS 是怎么管理内存的。
不同的系统版本对 App 运行时占用内存的限制不同,你可以利用我在第 14 篇文章中提到的方法,去查看不同版本系统对 App 占用内存的具体限制是多少。另外,系统版本的升级也会增加占用的内存,同时 App 功能的增多也会要求越来越多的内存。
然而,移动设备的内存资源是有限的,当 App 运行时占用的内存大小超过了限制后,就会被强杀掉,从而导致用户体验被降低。所以,为了提升 App 质量,开发者要非常重视应用的内存管理问题。
移动端的内存管理技术,主要有 GC(Garbage Collection,垃圾回收)的标记清除算法和苹果公司使用的引用计数方法。
相比较于 GC 标记清除算法,引用计数法可以及时地回收引用计数为 0 的对象,减少查找次数。但是,引用计数会带来循环引用的问题,比如当外部的变量强引用 Block 时,Block 也会强引用外部的变量,就会出现循环引用。我们需要通过弱引用,来解除循环引用的问题。
另外,在 ARC(自动引用计数)之前,一直都是通过 MRC(手动引用计数)这种手写大量内存管理代码的方式来管理内存,因此苹果公司开发了 ARC 技术,由编译器来完成这部分代码管理工作。但是,ARC 依然需要注意循环引用的问题。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
iOS内存管理涉及系统版本限制、GC标记清除算法和引用计数方法、ARC和MRC技术、内存管理演进过程等方面。不同系统版本对App占用内存的限制不同,升级和功能增加都会增加内存占用。移动设备内存有限,超出限制会导致强杀,影响用户体验。GC标记清除算法和引用计数法是主要的内存管理技术,ARC和MRC是对应的内存管理方式。虚拟内存通过映射实现程序间安全隔离,节省物理内存。分段技术将进程内存分开成独立的段,灵活管理内存空间。文章深入探讨了iOS内存管理的演进过程和技术细节,对于理解iOS内存管理方式有很大帮助。 iOS内存管理的原理包括虚拟内存、分页、多级页表、TLB缓存等技术。虚拟内存通过分页技术将地址空间切分成固定大小的单元,简化操作系统管理。多级页表技术有效减少内存占用,提高访问效率。移动设备采用Jetsam机制严格控制内存使用,避免磁盘和内存交换带来的效率问题。苹果公司在2018年的WWDC Session中详细介绍了iOS内存优化的方法,包括使用UIGraphicsImageRenderer替代UIGraphicsBeginImageContextWithOptions、使用ImageIO直接读取图片大小和元数据等。此外,第三方内存检测工具也是优化内存的重要工具。 总的来说,理解iOS内存管理原理对于开发者优化内存、提升用户体验至关重要。通过掌握虚拟内存、分页、多级页表等技术,开发者可以更好地优化内存使用,提高App性能。同时,借助苹果公司提供的优化建议和第三方工具,开发者可以更高效地进行内存优化工作。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》,新⼈⾸单¥59
《iOS 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- ColdMountain内存就是 那边程序员自我修养 书里面说的 前两章节 看了两遍 收获很大2019-06-0110
- 刘儒勇“虚拟页大小是 16K,那么虚拟页最多能有 2^48 / 2^14 = 16M 个,物理内存为 16G 对应物理页个数是 2^64 / 2^14 = 524k 个。” 2^48/2^14/2^30 = 16 G个虚拟内存页 物理内存16G ,2^34/2^14 = 2^20 = 1M 个2020-09-2713
- Geek_467f30"程序生成的汇编代码会放在代码段。" 是机器码吧2021-09-121
- accessory您好,对于虚拟页和物理页的映射图,进程1的虚拟页vp5和进程2的虚拟页vp4映射到同一个物理页pp2不会有问题嘛?2020-02-1911
- 阳光黑1MLeaksFinder在某个VC pop或dismiss后两秒会调用一个方法,如果能调用就说明该VC没有被释放掉2020-11-30
- nilunix like的os,kernel设计真的是经过千锤百炼,设计精妙且高效,叹服前辈们。沉淀下来的基本就是最佳实践,或者说在满足已有限制下的比较合理的trade-off2020-08-19
- 董尚斌您好,请教个问题。望回复。 iOS采用的是引用计数,在开启ARC的情况下,我在一个花括号里面申请的变量出了花括号是不是意味着会被编译器自动加入release的释放代码,即保证在引用计数归0自动dealloc。 那为啥还需要@autoreleasepool{...} 这样的逻辑,我直接使用花括号{}不就可以了吗[c 里面对于出栈的会自动释放],希望能明白我的意思。 {}出了这个花括号作用域之外,oc的对象不就自动销毁了吗?那为啥还要@autoreleasepool{}2020-04-016
- Bill哈哈程序员自我修养里见过😬2019-06-04
收起评论