硬广:《IOS性能调优系列》第二篇,持续更新,欢迎关注。

第一篇介绍了Analyze对App做静态分析,可以发现应用中的内存泄漏问题,对于有些内存泄漏情况通过静态分析无法解决的,可以通过动态分析来发现,分析起来更有针对性。

从本篇开始介绍XCode提供的强大的分析工具Instruments,内存分析只是Instruments中的一个功能,其他功能后续介绍。

使用Instruments动态分析内存泄漏


Instruments中的Leaks功能主要用于分析内存泄漏,还是以《IOS性能调优系列:Analyze静态分析》里内存泄漏的例子还实验:

 1 //截取部分图像
2 +(UIImage*)getSubImage:(unsigned long)ulUserHeader
3 {
4 UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
5 CGFloat height = sourceImage.size.height;
6 CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
7
8 CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
9 UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
10 //CGImageRelease(imageRef);
11
12 return smallImage;
13 }

用注释注释掉CGImageRelease(imageRef)这行,即使在ARC开启的环境下,仍然会导致内存泄漏(Arc is only for NSObject)。

使用Leaks开始动态分析,点击XCode的Product菜单Profile启动Instruments:

选择Leaks,会自动启动Leaks工具和IOS模拟器:

Leaks启动后会开始录制,随着对模拟器运行的App的操作,可以在Leaks中查看内存占用的情况。

注:如果你的项目使用了ARC,随着你的操作,不断开启或关闭视图,内存可能持续上升,但这不一定表示存在内存泄漏,ARC释放的时机是不固定的。

Leaks顶部分为两栏:Allocations和Leaks,右侧的曲线代表内存分配和内存泄漏曲线。

点击第二栏Leaks,进行内存泄漏分析,左下角会出现Leaks调试的选项:

建议把Snapshot Interval间隔时间设置为10秒,勾选Automatic Snapshotting,Leaks会自动进行内存捕捉分析。

在你怀疑有内存泄漏的操作前和操作后,可以点击Snapshot Now进行手动捕捉。

以下是切换到我的App中调用 +(UIImage*)getSubImage:(unsigned long)ulUserHeader 函数的视图,可以发现内存泄漏:

Leaked Object的表格中显示了内存泄漏的类型、数量及内存空间。

点击具体的某个内存泄漏对象,在右侧Detail窗口中会出现导致泄漏可能的位置,其中黑色头像代表了最可能的位置。

Leaks已成功找出了[CMTool getSubImage:]这个函数:

内存泄漏动态分析技巧


熟练使用Leaks后会对内存泄漏判断更准确,在可能导致泄漏的操作里,多使用Snapshot Now手动捕捉。

开始时如果设备性能较好,可以把自动捕捉间隔设置为5秒钟。

使用ARC的项目,一般内存泄漏都是malloc、自定义结构、资源引起的,多注意这些地方进行分析。

开启ARC后,内存泄漏的原因


开启了ARC并不是就不会存在内存问题,苹果有句名言:ARC is only for NSObject。

在IOS 中使用malloc分配的内存,ARC是不会处理的,需要自己进行处理。

例子中的 CGImageRef 也是一个Image的指针,ARC也不会进行处理。

摘自http://www.cnblogs.com/ym123/p/4311670.html


记录,为更好的自己!

豆电雨

IOS性能调优系列:使用Instruments动态分析内存泄漏的更多相关文章

  1. IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

    硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...

  2. IOS性能调优系列:使用Allocation动态分析内存使用情况

    硬广:<IOS性能调优系列>第三篇,持续更新,欢迎关注. <IOS性能调优系列:Analyze静态分析>介绍了使用静态分析方法查找IOS内存泄漏的方法,<IOS性能调优系 ...

  3. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

  4. IOS性能调优系列:Analyze静态分析

    目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和 ...

  5. iOS性能调优系列(全)

    总结: 三类工具 基础工具 (NSLog的方式记录运行时间.) 性能工具.检测各个部分的性能表现,找出性能瓶颈 内存工具.检查内存正确性和内存使用效率 性能工具: 可以衡量CPU的使用,时间的消耗,电 ...

  6. iOS 性能调优

    1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变量:(2)数据段:通常是存放已初始化的全局变量.(3)代码段:通常是存放程序执行 ...

  7. iOS性能调优

    写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...

  8. 关于iOS性能调优

    性能调优一直都是作为高阶iOS开发者的一个入门门槛,下面我搜集了日常查阅资料中见到的各种高质量调优博文,仅供参考 UIKit性能调优实战讲解 iOS 高效添加圆角效果实战讲解

  9. SQL Server性能调优系列

    这是关于SQL Server调优系列文章,以下内容基本涵盖我们日常中所写的查询运算的分解以及调优内容项,皆为原创........ 第一个基础模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础 ...

随机推荐

  1. Quartz-2D绘图之路径(Paths)详解

    在上篇文章中,我们简单的理解了绘图上下文,今天我们来认识一下Quartz-2D中另一个重要的概念,路径(Paths). 一.理解路径 路径定义了一个或多个形状,或是子路径.一个子路径可由直线,曲线,或 ...

  2. 系统设计 - IOS 程序插件及功能动态更新思路

    所用框架及语言 IOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面)        由 于Lua脚本语言,不需要编译即可运行 ...

  3. 三角网格(Triangle Mesh)的理解

    最简单的情形,多边形网格不过是一个多边形列表:三角网格就是全部由三角形组成的多边形网格.多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑.车辆.人体,当然还有茶壶等.图14.1 ...

  4. php实现无限级树型菜单(函数递归算法)

    首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码.也可以将第二步和第三步合为一步. 详细如下:1.数据库设计:脚本如下:CREATE TABL ...

  5. DOM中的范围 createRange()

    学习<JavaScript 高级程序设计> 12章dom范围的笔记 dom2级在Document类型中定义了 createRange()方法: 创建range对象很简单 var range ...

  6. C#程序中:如何删除xml文件中的节点、元素。

    C#中动态的清理xml文件中的垃圾信息是程序员必会的哦.这就像数据库一样,不会清理数据怎么可以呢?其实xml文件就可以用作一个小的数据库,存储一些简单的信息.所以,用C#程序实现xml文件的增.删.改 ...

  7. Xsd: Xml序列化、反序列化的利器

    下面讲述根据xml生成对应序列化反序列化类的过程,xml需要首先转化为xsd,然后再生成为实体类.其中,XSD是XML Schema Definition的缩写. 1.制作xml文件:   <? ...

  8. Zoj 3868 GCD Expectation

    给一个集合,大小为n , 求所有子集的gcd 的期望和 . 期望的定义为 这个子集的最大公约数的K次方 : 每个元素被选中的概率是等可能的 即概率 p = (发生的事件数)/(总的事件数); 总的事件 ...

  9. LINUX TOP,不是这样玩地!!!

    老同志遇到新问题了. TOP显示完全不是我要的,CPU,内存都是0.每个CPU还分别显示. 网上搜下,原来是A(显示风格)R(反向排序)P,M(CPU,内存排序)之类引起的. 记下了.

  10. 【UVALive - 3713】Astronauts (2-SAT)

    题意: 有n个宇航员,按照年龄划分,年龄低于平均年龄的是年轻宇航员,而年龄大于等于平均年龄的是老练的宇航员. 现在要分配他们去A,B,C三个空间站,其中A站只有老练的宇航员才能去,而B站是只有年轻的才 ...