《高性能 iOS 应用开发》笔记-内存管理篇

前言

该系列笔记,并不会记录所有书中写到的内容,而是摘录出其中相对比较重要的部分,作为一个索引。

正文

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

小结

  • 了解了如何管理内存,知道如何避免循环引用
  • 知道避免内存的消耗,降低平均和峰值内存
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容