iOS Instruments之Leaks

文章目录

    一、内存泄露和内存溢出

    1、内存泄露

    2、内存溢出

    3、内存泄露可能引发的问题

    二、如何检测你的程序存在内存泄露

    1、静态分析

    2、动态检测

一、内存泄露和内存溢出

1、内存泄露

 程序在申请内存后,无法释放已申请的内存空间

 标识 : dealloc()方法未调用

2、内存溢出

程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。

标识 :调用didReceiveMemoryWarning()

3、内存泄露可能引发的问题

 (1)内存消耗殆尽的时候,程序会因没有内存被杀死,即crash。
 (2)当内存快要用完的时候,会非常的卡顿
 (3)如果是ViewController没有释放掉,引起的内存泄露,还会引起其他
 很多问题,尤其是和通知相关的。没有被释放掉的ViewController还能接
 收通知,还会执行相关的动作,所以会引起各种各样的异常情况的发生。
 ...

 欢迎补充

二、如何检测你的程序存在内存泄露

1、静态分析

 x-code 菜单栏 Product ->  Analyse
 或者快捷键 : command+shift+B

静态分析的缺陷 :分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。这时候Instruments中的leak就可以用来动态检测内存泄露。

2、Leaks(找到引发内存泄漏的起点)

   用到Instruments中的Leaks是因为有些内存泄露
   是运行中用户操作过程中产生的内存泄露。内存泄露动态检测
   可在真机或模拟器上才做。

接下来我做个小demo演示一遍如何动态检测内存泄露,图文结合

(1)创建个项目,命名为MemoryLeaks, 在MRC环境下,如图所示

这里写图片描述

(2) 在ViewController中的viewDidLoad()函数添加一个按钮,并为按钮添加点击事件,实现如下:

- (void)btnAction:(UIButton*)sender
{
    NSObject *object = [[NSObject alloc]init];
    [object retain];
}

从上我们可以知道,当我们每点击按钮一次,创建一个对象,方法执行完成后,object的retainCount=2,且没为object进行release释放操作。即申请的内存无法得到释放。那么当经过数次点击后,就有可能把内存消耗殆尽,导致应用被杀死!那么我们可以肯定的是,此处存在内存泄露。

(3) 运行项目 (command + R) 到模拟器 IPhoneX,运行成功后stop
.

(4) 打开Instuments (点击X-code 菜单栏, X-code -> Open Developer Tool ->Instruments )
.

(5) 在Instruments顶部选好模拟器IPhoneX,选择分析项目MemoryLeaks,选择内存泄露检测,choose完成。如下图
这里写图片描述
.

(6) 打开后界面如下,对界面几个按钮进行解释说明如下
这里写图片描述
.
注意:Leaks 启动后会开始录制,随着对模拟器运行的App的操作,可以在Leaks中查看内存占用的情况。
.

(7) 点击Leaks,将导航栏切换到 “Call Tree模式下”,并设置 Call Tree 选项,如下图
这里写图片描述
.

(8) 点击 左上角的 start recording 按钮,对模拟器的按钮进行点击操作,显示页面如下
这里写图片描述

.
(9) 双击页面跳转如下图,结果分析如下
这里写图片描述
.

(10) 关于自动内存捕捉分析时间间隔
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值