实现 iOS 内存检测工具
在 iOS 开发中 内存泄漏是常见的问题, 这里整理下常用的内存检测方法.
一 静态检测方法
使用XCode分析功能,Product->Analyze
使用静态检测可以检查出一些明显的没有释放的内存,包括NSObject和CF开头的内存泄漏.
缺点: 不能检测block导致的内存泄漏问题
二 动态检测方法
使用 instruments
三 dealloc 重新检测
重写dealloc 方法, 在界面返回或者对象销毁的时候, 判断是否调用
四 第三方检测方法
MLLeaksFinder
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 内存检测工具相关推荐
- ios代码中的内存泄露,内存检测工具leaks 检测不出来
iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使 ...
- 内存检测工具Dr. Memory的使用
Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访问.数组越界读/写.以及内存泄露等.它可以在Linux.Windo ...
- 动态内存检测工具Valgrind
1. Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来 ...
- 【调试】Linux下超强内存检测工具Valgrind
[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...
- 台式机内存测试软件中文版,内存检测工具 MemTest
MemTest是可靠的内存检测工具,通过对电脑进行储存与读取操作来分析检查内存情况.内存检测工具 MemTest不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌 ...
- 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...
在去电脑城去买内存条,不知道该内存条怎么样,怕自己遇到不法奸商.金山卫士已经集成 内存条检测工具,可以智能监测到该内存所有信息以及该内存性能怎么样. 内存检测工具 就用金山卫士 许多网民从电脑城购买回 ...
- 内存测试内存检测工具
测试内存,往往不局限于一种软件,因为每种工具都有自己的局限性.灵活运用多种工具,可以实现效益最大化 1.<HCI MemTest> https://hcidesign.com/memtes ...
- 内存检测工具:sanitizer
1. 背景 内存泄漏是一个比较常见的问题,之前使用的是valgrind来实现内存检查的情况比较多,这里介绍一种更加便利的内存检测工具, 那就是gcc自带的sanitizer. 2. sanitizer ...
- linux内存测试工具memtest,内存检测工具Memtest使用方法(图文教程)
MemTest Version是个比较少见的内存检测工具,它不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌控到目前你机器上正在使用的内存到底可不可信赖. 使用 ...
最新文章
- 第二冲刺站立会议01
- [deviceone开发]-do_Album的简单示例
- 虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程
- oracle date引入哪个包,oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题...
- Linux驱动:VFIO概述(vfio/iommu/device passthrough)
- ie检查服务器证书吊销,浏览器弹出“该站点安全证书吊销信息不可用是否继续”解决方法...
- 阿群笔记:CentOS7 在线安装 docker 的推荐方法
- js 所有img隐藏_Handtrack.js 开源:3行JS代码搞定手部动作跟踪
- 图像处理-Sobel边缘检测(C++实现,不依赖opencv)
- OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库
- vue引入萤石云监控进行播放
- python3手机版画图软件_Python实现画图软件功能方法详解
- 用Python爬取京东手机评论
- Unity Shader - 搬砖日志 - URP PBR (抄作业篇,持续更新~)
- 猜大小游戏(条件判断)
- 基于Insightface的人脸识别
- Comparator自定义顺序
- 基于stm32c8t6的两轮平衡小车 第一篇——物料选购
- SpringBoot+Vue实现前后端分离的旅游网站
- Python的安装和环境配置