问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

iOS应用内存泄露检测与优化实战

创作时间:
作者:
@小白创作中心

iOS应用内存泄露检测与优化实战

引用
1
来源
1.
https://www.cnblogs.com/liweihang/p/18603202

iOS应用的内存管理是开发过程中非常重要的一环,内存泄露不仅会导致应用性能下降,还可能引发崩溃。本文将详细介绍如何使用Xcode自带的工具(Memory Report、Allocations、Leaks和Debug Memory Graph)来检测和优化内存泄露问题,并推荐了一个实用的第三方工具MLeaksFinder。

原理

内存泄露通常发生在对象被意外地持续引用,导致无法被释放。例如,在一个ViewController(VC)A中push另一个VC B,如果在pop回VC A时,内存大小没有恢复到push前的大小,就可能存在内存泄露。

分析工具

Memory Report

Memory Report可以实时查看整个应用当前的内存使用情况,但只能用于初步定位哪些页面可能有内存泄漏或内存抖动问题。具体检测可能不够准确,需要结合其他工具进行确认。

Allocations

Allocations是更专业的内存检测工具,可以详细查看内存分配情况。通过不同的数据视图(Statistics、Call Trees、Allocations List、Generations),可以分析代码的性能瓶颈和内存使用情况。

Leaks

Leaks主要用于检测内存泄漏,但对循环引用的检测效果有限,可能无法区分是程序员的逻辑设计还是真正的bug。

Debug Memory Graph

Debug Memory Graph可以图形化显示内存分配和引用情况,特别适合发现循环引用问题。使用前需要在Xcode的Scheme设置中开启Malloc Scribble和Malloc Stack。

优化方法

Block循环引用

在使用Block时,容易产生循环引用。例如,一个ViewController被Block强引用,形成循环引用,导致ViewController无法释放。解决方法是使用@weakify@strongify宏,或者手动创建弱引用。

定时器循环引用

定时器也容易导致循环引用。解决方案包括在退出时显式调用invalidate方法,或者使用中间对象(如NSProxy子类)作为定时器的target,避免直接强引用目标对象。

静态分析工具

Xcode自带的Analyze工具可以静态分析代码,检测潜在的逻辑错误、内存管理错误、声明错误和API调用错误。

第三方工具推荐

MLeaksFinder是一个精准的iOS内存泄露检测工具,使用简单且不侵入业务逻辑代码。它通过AOP技术hook UIViewController和UINavigationController的pop和dismiss方法,检测对象是否被正确释放。最新版本还结合了FBRetainCycleDetector来检测循环引用。

使用MLeaksFinder时需要注意以下几种情况:

  • 第一次pop时弹出Leak弹窗,后续操作中既不报Object Deallocated也不报Memory Leak,说明对象被设计成单例或缓存。
  • 第一次pop时弹出Leak弹窗,后续操作中对同一类对象反复报Object Deallocated和Memory Leak,说明释放不及时但不是真正的内存泄漏。
  • 第一次pop时弹出Leak弹窗,后续操作中不报Object Deallocated但每次pop都报Memory Leak,这才是真正的内存泄漏。

其他推荐的内存检测工具还包括FBAllocationTracker、FBRetainCycleDetector和OOMDetector等。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号