iOS平台内存管理的那些事

本文深入介绍了iOS平台的内存管理机制,包括引用计数原理、自动引用计数(ARC)、内存报警机制及其处理流程。此外,还提供了内存检测工具如Leak和Allocations的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS平台内存管理介绍

iOS平台的内存管理采用引用计数的机制。当创建一个对象时使用alloc或者allWithZone方法时,引用计数就会+1;当释放对象使用release方法时,引用计数就是-1;这就意味着每一个对象都会跟踪有多少其他对象引用它,一旦引用计数为0,该对象的内存就会被释放掉;另外,iOS也提供了一种延时释放的机制AutoRelease,以这种方式申请的内存,开发者无需手动释放,系统会在某一时机释放该内存。

下图是内存从申请到释放的一个完整示例:
 




由于iOS平台的这种内存管理的多样性,iOS5之前,导致开发者在内存使用上很容易出现内存泄漏或者程序莫名崩溃的情况。幸好,从iOS5开始,Apple就使用了ARC机制,大大简化了内存的使用问题,开发者需要考虑内存的情形就比较少了,比如CG、CF函数还是需要开发者自己动手释放。


iOS平台内存报警机制

由于iOS平台的内存管理机制,不支持虚拟内存,所以在内存不足的情况,不会去Ram上创建虚拟内存;所以一旦出现内存不足的情况,iOS平台会通知所有已经运行的app,不论是前台app还是后台挂起的app,都会收到 memory warning的notice;一旦app收到memory warning的notice,就应该回收占用内存较大的变量。


内存报警处理流程


1: app收到系统发过来的memory warning的notice;

2: app释放占用较大的内存;

3: 系统回收此app所创建的autorelease的对象;

4: app返回到已经打开的页面时,系统重新调用viewdidload方法,view重新加载页面数据;重新显示;


内存报警测试方法


在Simulate上可以模拟低内存报警消息;

iOS模拟器 -> 硬件 -> 模拟内存警告;

开发者可以在模拟器上来模拟手机上的低内存报警情况,可以避免由于低内存报警引出的app的莫名crash问题;


iOS平台内存检查工具

编译和分析工具Analyze

iOS的分析工具可以发现编译中的warning,内存泄漏隐患,甚至还可以检查出logic上的问题;所以在自测阶段一定要解决Analyze发现的问题,可以避免出现严重的bug;


内存泄漏隐患提示:
Potential Leak of an object allocated on line ……

数据赋值隐患提示:
The left operand of …… is a garbage value;

对象引用隐患提示:
Reference-Counted object is used after it is released;
以上提示均比较严重,可能会引起严重问题,需要开发者密切关注!


内存检测工具

内存泄漏检测工具—Leak


Leak工具可以很容易的统计所有内存泄漏的点,而且还可以显示在那个文件,哪行代码有内存泄漏,这样定位问题比较容易,也比较方面;但是Leak在统计内存泄漏的时候会把autorelease方式的内存也统计进来; 所以我们在查找内存泄漏情况的时候,可以autorelease的情况忽略掉;

Leak工具:

通过Leak工具可以很快发现代码中的内存泄漏,通过工具也可以很快找到发生内存泄漏的代码段:

 



内存猛增检测工具—Allocations

Allocations工具可以很容易的列出所有分配内存的点,这样我们可以按照分配内存大小来进行排序, 这样可以很容易的发现哪些点分配的内存最多,而且是持续分配,这样我们来针对性的分析这些持续分配较大内存的地方;

 


此工具会显示出所有申请内存的地方,并统计申请的次数和大小; 从这个列表中可以找出内存申请次数最多且申请内存最大的语句;从而分析出哪些地方使用的内存最多,进而可以优化和改进;

 


上图是按照申请内存多少来排序的,可以方便的了解哪些代码申请的内存多;


参考资料

http://www.cocoachina.com/bbs/read.php?tid=15963

http://developer.apple.com/library/IOs/navigation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值