一. 简述
手机的内存资源是非常有限的,如果一个应用的内存使用量超过了单个进程的上限,就会被操作系统终止使用,正式这个原因,内存管理在iOS中扮演着核心的角色。
与(基于垃圾回收的)Java 运行时不同,Objective-C 和 Swift 的 iOS 运行时使用引用计数。 使用引用计数的负面影响在于,如果开发人员不够小心,那么可能会出现重复的内存释放 和循环引用的情况。
1.内存消耗
内存消耗指的是应用消耗的 RAM。应用中的内存消耗分为两部分:栈大小和堆大小。
1.1 栈大小
可被递归调用的最大方法数
每个方法都有其自己的栈帧,并会消耗整体的栈空间。如果你调 用 main,那么 main 将调用 method1,而 method1 又将调用 method2,这就存在三个栈帧 了,且每个栈帧都会消耗一定字节的内存。
一个方法中最多可以使用的变量个数
视图层级中可以嵌入的最大视图深度
渲染复合视图将在整个视图层级树中递归地调用 layoutSubViews 和 drawRect 方法。如 果层级过深,可能会导致栈溢出。
1.2 堆大小
每个进程的所有线程共享同一个堆。一个应用可以使用的堆大小通常远远小于设备的 RAM 值。例如,iPhone 5S 拥有大约 1GB 的 RAM,但分配给一个应用的堆大小最多不到 512MB。应用并不能控制分配给它的堆。只有操作系统才能管理堆。
使用 NSString、载入图片、创建或使用 JSON/XML 数据、使用视图等都会消耗大量的堆 内存。如果你的应用大量使用图片(与 Flickr 和 Instagram 应用类似),那么你需要格外关 注平均值和峰值内存使用的最小化。
didReceiveMemoryWarning
建议使用量不要超过 80%~85%,要给操作系统的核 心服务留下足够多的内存。