iOS应用程序内存泄露的监测
iOS程序内存泄露的检测
文章目录
- iOS程序内存泄露的检测
- Allocation工具
- 使用步骤
- 1.制造内存泄露
- 2.使用Allocations工具进行内存检测
- 总结
# 前言 Instruments是一个灵活又强大的工具,它可以让开发者跟踪一个或者多个进程,并检测收集的实时数据,使开发者更好地理解应用程序和操作系统的行为和性能。 本文将演示如何使用Instruments中的Allocation和Leaks工具,进行分析和修复应用程序中内存泄露的问题。 本文用OC语言来制造内存泄露案例
Allocation工具
Instruments中的Allocation工具,可以显示内存中的对象占用曲线,内存当前分配给了哪些对象,被分配内存的对象数量,以及由哪些函数进行对象的创建。因此我们可以使用这些信息,识别应用程序中的内存分配状况,从而定位应用程序内存效率低下的地方。
使用步骤
1.制造内存泄露
创建两个类:Person、Dog,让他们之间互相强引用。代码如下(示例):
Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
NS_ASSUME_NONNULL_BEGIN@class Dog;@interface Person : NSObject@property (nonatomic, strong)NSString *name;
@property (nonatomic, strong)Dog *dog;
@endNS_ASSUME_NONNULL_END
Person.m
#import "Person.h"
#import <objc/runtime.h>@implementation Person- (instancetype)init
{self = [super init];if (self) {NSLog(@"Person对象创建,地址:%p",&self);}return self;
}- (void)dealloc
{NSLog(@"Person对象销毁");
}
@end
Dog.h
#import <Foundation/Foundation.h>
#import "Person.h"NS_ASSUME_NONNULL_BEGIN@class Person;@interface Dog : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Person *master;
@endNS_ASSUME_NONNULL_END
Dog.m
#import "Dog.h"@implementation Dog- (instancetype)init
{self = [super init];if (self) {NSLog(@"Dog对象创建,地址:%p",&self);}return self;
}- (void)dealloc
{NSLog(@"Dog对象销毁");
}
@end
ViewController.m
#import "ViewController.h"
#import "Person.h"
#import "Dog.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{Person *person = [[Person alloc] init];person.name = @"小丁";Dog *dog = [[Dog alloc] init];dog.name = @"黑豹";//关键在下面两行代码,互相强引用person.dog = dog;dog.master = person;dog = nil;person = nil;}@end
2.使用Allocations工具进行内存检测
入口:【Product > Profile】
窗口中列出了所有的instrument工具,选择Allocation,点击左上角的红点按钮开始检测应用程序,点击屏幕触发touchesBegan方法,然后搜索Person对象,果然如下图所示,定位到了内存泄露有关的代码信息。
你以为到这里就结束了吗?不,还没有!现在我们来改一下touchesBegan方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{Person *person = [[Person alloc] init];person.name = @"小丁";Dog *dog = [[Dog alloc] init];dog.name = @"黑豹";person.dog = dog;dog.master = person;dog = nil;person = nil;//添加可以正常释放的几个对象Person *person1 = [[Person alloc] init];Person *person2 = [[Person alloc] init];Dog *dog1 = [[Dog alloc] init];Dog *dog2 = [[Dog alloc] init];dog1 = nil;dog2 = nil;person1 = nil;person2 = nil;
}
然后我们再回到Allocation中,修改两个选项:
修改完毕继续调试应用程序
我们发现几个live栏中没有小黑点的对象,说明这些对象已经成功从内存中清除,还记得我们再delloc方法中添加的代码吗?没错,它成功在日志中输出了。如下图
好的,到此我们Allocation用法就结束了
总结
虽然说良好的编程习惯可以杜绝大部分的内存泄露,但是当iOS加入了ARC机制,相互引用关系比较复杂时,内存泄露还是可能存在的,因此学会利用这些简单有效的工具来进行检测,有助于我们开发更加稳定和安全的应用程序。
参考文献:《iOS移动开发从入门到精通》
iOS应用程序内存泄露的监测相关推荐
- Go程序内存泄露问题快速定位 | Gopher Daily (2021.09.01) ʕ◔ϖ◔ʔ
每日一谚:Less is more. Go技术生态 github针对go仓库提供免费的持续benchmark服务 - https://github.com/marketplace/gobencher ...
- Go程序内存泄露问题快速定位
前几天有同学反馈了 cgo 内存泄露问题,自己也针对这个问题探索了一番,算是为以后解决类似问题提前攒点经验吧.也趁机整理了一下 go 开发过程中内存泄露问题的一些常用排查方法,也希望对新接触 go 的 ...
- 生产环境Go程序内存泄露,用pprof如何快速定位
内存泄漏可以在整个系统中以多种形式出现,除了在写代码上的疏忽,忘了关闭该关闭的资源外,更多的时候导致系统发生内存泄露原因可能是设计上决策不对.或者业务逻辑上的疏忽没有考虑到一些边界条件. 比如查数据库 ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- c++应用程序内存泄露检测
前言:c++及c这种底层的编程语言,在获得更多程序控制自由度的同时,也承担了更多内存泄露的风险,有些同学想说,内存泄露只要看下c++的应用程序在运行时内存有没有一直增加不就行了吗,windows和li ...
- 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx
RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小. RSS 不包括进入交换分区的内存. RSS 包括共享库占用的内存(只要共享库在内存中) RSS 包括所有分配的栈 ...
- linux环境下QT程序内存泄露检测-Qt creator +Valgrind检测内存泄漏(linux)
原文查看具体内容: Qt creator +Valgrind检测内存泄漏(linux)_枫影竹韵的博客-CSDN博客 一.说明 由于Qt creator和valgrind是相互独立的,所以需要安装va ...
- C++ 检测内存泄露
本文描述了如何检测内存泄露.最主要的是纯C,C++的程序如何检测内存泄露. 现在有很多专业的检测工具,比如比较有名的BoundsCheck, 但是这类工具也有他的缺点,我认为首先BoundsCheck ...
- JAVA处理 M_一次Java内存泄露处理手记
现象 最近项目组从NET平台迁移到Java的Dubbo平台上,由于大家都是Java的生手,发生了蛮多的问题,以后一一记录.现在解决一个遇到的关于Java程序内存泄露的问题. 特别说明 Java萌新,理 ...
最新文章
- 数据科学究竟是什么?
- R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)
- rhel 6.4 + udev + 11.2.0.3 + asm 单点安装
- 《社交网站界面设计(原书第2版)》——2.10 自我反省式的出错信息
- bloc+rxdart解决代码混乱大问题
- 编写DLL所学所思(1)——导出函数
- 在论坛中出现的各种疑难问题:日志收缩问题
- php按照文件名字排序,php readdir 排序问题,如何按照日期进行排序
- 对于华为,英特尔与微软表示继续提供支持;亚马逊亲证云计算服务出现宕机;中国移动5G套餐曝光,每月都含200G流量……...
- 二叉树构造c语言实现,递归创建二叉树c语言实现+详细解释
- 计算机图形学------空间摄像机
- C++算法学习(力扣:1269. 停在原地的方案数)
- 通过css使文字有渐变的效果
- 替换空格python实现
- m126a linux驱动下载,惠普hp M126a打印机驱动
- Qt Qml 开发超高清 4K、8K 视频直播视频客户端
- 如何经营好(开好)一家淘宝店铺
- html5 canvas实现led样式数字字体
- c++语言题库,计算机二级c++题库软件下载
- mysql8.0.17 汉化