在 iOS 开发中 内存泄漏是常见的问题, 这里整理下常用的内存检测方法.

一 静态检测方法

使用XCode分析功能,Product->Analyze

使用静态检测可以检查出一些明显的没有释放的内存,包括NSObject和CF开头的内存泄漏.

缺点: 不能检测block导致的内存泄漏问题

二 动态检测方法

使用 instruments

三 dealloc 重新检测

重写dealloc 方法, 在界面返回或者对象销毁的时候, 判断是否调用

四 第三方检测方法

MLLeaksFinder

主要检查UI方面的泄漏,集成简单,优点如下:
1.不同于instrument的分析功能,需要人工观察,这个工具自动检测,发现有泄漏后可以实时进行提示,虽然主要是针对UI,但对于一般的工程来说,内存泄漏的场景中还是以UI居多,因此可以解决很大部分的问题。
2.在新功能的开发过程和解决bug的过程中,出现内存泄漏都可以很轻松的检测出来。
其原理如下: 

(1) 检测viewController在pop后 是否已经释放
(2) 在viewWillAppear中将标志位设置NO
(3) 在Navgation pop后将标志位设置为YES
(4) 在viewDidDisappear 中判断标志位

我们根据这个原理, 简单实现一个自己简易的内存检测工具:

(1) 用runtime的技术交换 viewController 的 viewWillAppear 和 viewDidDisappear;

(2) 在viewWillAppear 中将标志位设为 NO, 代码如下:

- (void)sw_viewWillAppear:(BOOL)animated{[self sw_viewWillAppear:animated];objc_setAssociatedObject(self, &kLeakMemory, @(NO), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

(3) 交换 navigationController 的 popViewControllerAnimated, 并在其中将标志位设为YES

- (nullable UIViewController *)sw_popViewControllerAnimated:(BOOL)animated{UIViewController *vc = [self sw_popViewControllerAnimated:animated];extern const char *kLeakMemory;objc_setAssociatedObject(self, &kLeakMemory, @(YES), OBJC_ASSOCIATION_RETAIN_NONATOMIC);return vc;
}

(4) 在viewController的viewDidDisappear中判断标志位, 并延时检测dealloc是否调用

- (void)sw_viewDidDisappear:(BOOL)animated{[self sw_viewDidDisappear:animated];if (objc_getAssociatedObject(self, &kLeakMemory)) {[self willDealloc];}
}- (BOOL)willDealloc {if (![super willDealloc]) {return NO;}return YES;
}
/**super willDealloc*/
- (BOOL)willDealloc{// 这里注意, 使用weakSelf 防止引起循环引用__weak typeof(self) weakSelf =  self;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{__strong typeof(weakSelf) strongSelf = weakSelf;[strongSelf showMsg:NSStringFromClass([strongSelf class])];});return YES;
}- (void)showMsg:(NSString *)msg{UIAlertView *alertViewTemp = [[UIAlertView alloc] initWithTitle:@"Leak"message:msgdelegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil];[alertViewTemp show];
}

Demo

如有疑问, 欢迎指出.

实现 iOS 内存检测工具相关推荐

  1. ios代码中的内存泄露,内存检测工具leaks 检测不出来

    iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使 ...

  2. 内存检测工具Dr. Memory的使用

    Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访问.数组越界读/写.以及内存泄露等.它可以在Linux.Windo ...

  3. 动态内存检测工具Valgrind

    1. Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来 ...

  4. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  5. 台式机内存测试软件中文版,内存检测工具 MemTest

    MemTest是可靠的内存检测工具,通过对电脑进行储存与读取操作来分析检查内存情况.内存检测工具 MemTest不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌 ...

  6. 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...

    在去电脑城去买内存条,不知道该内存条怎么样,怕自己遇到不法奸商.金山卫士已经集成 内存条检测工具,可以智能监测到该内存所有信息以及该内存性能怎么样. 内存检测工具 就用金山卫士 许多网民从电脑城购买回 ...

  7. 内存测试内存检测工具

    测试内存,往往不局限于一种软件,因为每种工具都有自己的局限性.灵活运用多种工具,可以实现效益最大化 1.<HCI MemTest> https://hcidesign.com/memtes ...

  8. 内存检测工具:sanitizer

    1. 背景 内存泄漏是一个比较常见的问题,之前使用的是valgrind来实现内存检查的情况比较多,这里介绍一种更加便利的内存检测工具, 那就是gcc自带的sanitizer. 2. sanitizer ...

  9. linux内存测试工具memtest,内存检测工具Memtest使用方法(图文教程)

    MemTest Version是个比较少见的内存检测工具,它不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌控到目前你机器上正在使用的内存到底可不可信赖. 使用 ...

最新文章

  1. 第二冲刺站立会议01
  2. [deviceone开发]-do_Album的简单示例
  3. 虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程
  4. oracle date引入哪个包,oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题...
  5. Linux驱动:VFIO概述(vfio/iommu/device passthrough)
  6. ie检查服务器证书吊销,浏览器弹出“该站点安全证书吊销信息不可用是否继续”解决方法...
  7. 阿群笔记:CentOS7 在线安装 docker 的推荐方法
  8. js 所有img隐藏_Handtrack.js 开源:3行JS代码搞定手部动作跟踪
  9. 图像处理-Sobel边缘检测(C++实现,不依赖opencv)
  10. OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
  11. vue引入萤石云监控进行播放
  12. python3手机版画图软件_Python实现画图软件功能方法详解
  13. 用Python爬取京东手机评论
  14. Unity Shader - 搬砖日志 - URP PBR (抄作业篇,持续更新~)
  15. 猜大小游戏(条件判断)
  16. 基于Insightface的人脸识别
  17. Comparator自定义顺序
  18. 基于stm32c8t6的两轮平衡小车 第一篇——物料选购
  19. SpringBoot+Vue实现前后端分离的旅游网站
  20. Python的安装和环境配置

热门文章

  1. Redis5.0+——集群搭建,水平扩容
  2. js中数组的高逼格操作(filter、sort、map、reduce)
  3. 专访许长敬:移动互联网将进入电子商务阶段
  4. 专门除COD有机物的树脂工艺
  5. 论浏览器冲突引起的桌面和任务栏图标一直闪的解决办法
  6. 队列--参考源码(转)
  7. 25款顶级的jQuery表格插件
  8. java基础(javaBase)推箱子,课程总结
  9. unix中嘚vim编辑器
  10. maya2018的uv导入和导出