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应用程序内存泄露的监测相关推荐

  1. Go程序内存泄露问题快速定位 | Gopher Daily (2021.09.01) ʕ◔ϖ◔ʔ

    每日一谚:Less is more. Go技术生态 github针对go仓库提供免费的持续benchmark服务 - https://github.com/marketplace/gobencher ...

  2. Go程序内存泄露问题快速定位

    前几天有同学反馈了 cgo 内存泄露问题,自己也针对这个问题探索了一番,算是为以后解决类似问题提前攒点经验吧.也趁机整理了一下 go 开发过程中内存泄露问题的一些常用排查方法,也希望对新接触 go 的 ...

  3. 生产环境Go程序内存泄露,用pprof如何快速定位

    内存泄漏可以在整个系统中以多种形式出现,除了在写代码上的疏忽,忘了关闭该关闭的资源外,更多的时候导致系统发生内存泄露原因可能是设计上决策不对.或者业务逻辑上的疏忽没有考虑到一些边界条件. 比如查数据库 ...

  4. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  5. c++应用程序内存泄露检测

    前言:c++及c这种底层的编程语言,在获得更多程序控制自由度的同时,也承担了更多内存泄露的风险,有些同学想说,内存泄露只要看下c++的应用程序在运行时内存有没有一直增加不就行了吗,windows和li ...

  6. 测试同学反馈,java 程序内存泄露,症状是RSS不断增加超过了jvm的xmx

    RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小. RSS 不包括进入交换分区的内存. RSS 包括共享库占用的内存(只要共享库在内存中) RSS 包括所有分配的栈 ...

  7. linux环境下QT程序内存泄露检测-Qt creator +Valgrind检测内存泄漏(linux)

    原文查看具体内容: Qt creator +Valgrind检测内存泄漏(linux)_枫影竹韵的博客-CSDN博客 一.说明 由于Qt creator和valgrind是相互独立的,所以需要安装va ...

  8. C++ 检测内存泄露

    本文描述了如何检测内存泄露.最主要的是纯C,C++的程序如何检测内存泄露. 现在有很多专业的检测工具,比如比较有名的BoundsCheck, 但是这类工具也有他的缺点,我认为首先BoundsCheck ...

  9. JAVA处理 M_一次Java内存泄露处理手记

    现象 最近项目组从NET平台迁移到Java的Dubbo平台上,由于大家都是Java的生手,发生了蛮多的问题,以后一一记录.现在解决一个遇到的关于Java程序内存泄露的问题. 特别说明 Java萌新,理 ...

最新文章

  1. 数据科学究竟是什么?
  2. R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)
  3. rhel 6.4 + udev + 11.2.0.3 + asm 单点安装
  4. 《社交网站界面设计(原书第2版)》——2.10 自我反省式的出错信息
  5. bloc+rxdart解决代码混乱大问题
  6. 编写DLL所学所思(1)——导出函数
  7. 在论坛中出现的各种疑难问题:日志收缩问题
  8. php按照文件名字排序,php readdir 排序问题,如何按照日期进行排序
  9. 对于华为,英特尔与微软表示继续提供支持;亚马逊亲证云计算服务出现宕机;中国移动5G套餐曝光,每月都含200G流量……...
  10. 二叉树构造c语言实现,递归创建二叉树c语言实现+详细解释
  11. 计算机图形学------空间摄像机
  12. C++算法学习(力扣:1269. 停在原地的方案数)
  13. 通过css使文字有渐变的效果
  14. 替换空格python实现
  15. m126a linux驱动下载,惠普hp M126a打印机驱动
  16. Qt Qml 开发超高清 4K、8K 视频直播视频客户端
  17. 如何经营好(开好)一家淘宝店铺
  18. html5 canvas实现led样式数字字体
  19. c++语言题库,计算机二级c++题库软件下载
  20. mysql8.0.17 汉化

热门文章

  1. OpenGL画三角形
  2. (OS 10038)在一个非套接字上尝试了一个操作 的解决办法
  3. python简史_Python简史
  4. 数字功放-耐福NTP功放芯片详细性能概述
  5. android百度天气接口api接口,百度天气接口api
  6. OpenStack核心组件原理与应用之Nova(未完待续)
  7. flatMap,zip,Merge区别
  8. 烂笔头 | OpenMMLab 第一讲
  9. 宝付国际手把手教你如何成为亚马逊卖家
  10. 地图坐标概念 html,普通地图坐标