《高性能 iOS 应用开发》笔记-内存管理篇
2018-09-09 本文已影响0人
郑一一一一
前言
该系列笔记,并不会记录所有书中写到的内容,而是摘录出其中相对比较重要的部分,作为一个索引。
正文
- 内存消耗:指的是应用消耗的 RAM。在 iOS 中,虚拟内存并不包含虚拟内存,磁盘不会用于分页。可分为栈大小和堆大小。
- 栈大小:每个线程都有专用的栈空间,受限制的条件包括:
可被递归调用的方法数
、方法中的变量个数
、最大视图深度
。以上三种情况均可能导致栈溢出。 - 堆大小:每个进程的所有线程共享一个堆。使用 NSString、载入图片、创建或使用 JSON/XML 数据会消耗大量的堆内存。需要特别关注平均值和峰值内存使用的最小化。例如 UITableView 中,数据源是 Photo 数组,为了避免很高的峰值内存,解决方案之一是控制在数组中存储固定数量的图片。通过换入换出,来进行平衡。
- 自动释放对象的作用:让你能够放弃对一个对象的持有关系,但延后对它的销毁。当在方法中那个创建一个对象并需要将其返回时,自动释放就显得非常有用了。
- 自动释放池块什么时候需要自己创建?
当有一个创建了很多临时对象的循环时
,当创建一个线程时
。 - 僵尸对象:用于捕捉内存错误的调试功能。一般情况下引用计数为0时对象会立即被释放,这会造成难以调试。开始僵尸模式,有助于调试。
- 循环引用场景:委托、block、定时器
- 观察者模式 KVO处理可以比对 FBKVO 来查看
- 通知中心 AddObserver 方法在 iOS 9 以后不用主动移除
- 弱类型 id 缺点,以及替代方法
- 对象寿命与泄漏:避免使用单例和全局变量。
- 单例:队列操作(日志和埋点)、访问共享资源(缓存)、资源池(线程池或连接池)。尽量避免使用和避免对象级的属性,使用本地变量,
使用依赖注入
。
小结
- 了解了如何管理内存,知道如何避免循环引用
- 知道避免内存的消耗,降低平均和峰值内存