用Instruments检测内存泄露

用Instruments检测内存泄露

标签:Xcode

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dawn110110.blog.51cto.com/3049492/899283

IPhone上木有垃圾回收,动态申请的内存要自己记得释放,此文自己总结一下可能出现内存泄露的各种情况,以及检测方法。

内存泄露说白了,就是有这样一块动态申请的内存,但木有任何一个指针指向它。

举例来说,在C++中:

  1. MyClass * foo = new MyClass;
  2. foo = NULL;

类似地在objective-C中:

  1. MyClass *foo = [[MyClass alloc] init];
  2. foo = nil;//内存泄露了!

或者有这样一个类:

  1. @interface Foo : NSObject
  2. {}
  3. @end
  4. @implementation Foo
  5. -(id) init
  6. {
  7. if ((self = [super init])) {
  8. NSMutableString * string = [[NSMutableString alloc] initWithString:@"Leaker!!!"];
  9. string = nil;//泄露了!这句之后那个字符串对象应用退出之前不会被释放。
  10. }
  11. return self;
  12. }
  13. - (void) dealloc
  14. {
  15. [super dealloc];
  16. }
  17. @end

出现内存泄露会怎样?

答:很小的泄露,没事!应用退出的时候所用内存都会被清理,包括泄露的,而且IPhone应用不会申请到共享内存,不会波及到整个系统,不会出现系统范围的内存泄露。要是泄露的比较多,而且反复不停地出现内存泄露,顶多应用崩溃掉。不过想发布到AppStore的话,有内存泄露一般会被苹果拒绝……。

先来看看IPhone里内存是怎么管理的,首先:木有自动垃圾回收!其次:有引用记数!

NSObject对象有个属性:retainCount,所以所有对象都要继承自NSObject,才有统一的引用计数…。

然后牢记记住下面8件事:

  • 1 这个retainCount == 0的时候,对象的dealloc方法会被调用,对象就被释放了。
  • 2 永远不要显示调用dealloc方法
  • 3 [obj retain]; // obj.retainCount++ 引用记数+1
  • 4  [obj release]; // obj.retainCount-- 引用记数-1
  • 5 MyClass * obj = [[MyClass alloc] init];// obj.retainCount = 1 初值为1
  • 6 对于有retain特性的属性比如下面这个:
  1. @interface MyClass : NSObject {
  2. NSObject* foo;
  3. }
  4. @property (noatomic,retain) NSObject * foo;
  5. @end
  6. @implementation MyClass
  7. @synthesize foo;
  8. ...
  9. //下面两行正确的写法
  10. self.foo = bar;// [foo release]; foo = bar; [foo retain]; 会发一个release给原来的对象,发一个retain 给新对象
  11. self.foo = nil;// [foo release]; 会发一个release 消息给对象
  12. //下面一行写法不对
  13. foo = bar;// 没发release给foo 没发retain给bar ,这种写法是不对的。
  14. ...
  15. @end

参考:

苹果的文档 和 具体实现的解释

  • 7 对于stringWithString 这种方法创造的对象,一个Runloop结束时,对象会被发送一个release消息,需要注意的有两点,一是注意理解Runloop,避免Runloop结束后对象被释放了却又使用对象,二是 如果用instruments工具检测内存泄露,这种使用autorelease的情况也会被当做内存泄露处理,注意识别……。
  • 8 对于NSMutableArray这种类,当addObject的时候,相应被加入array中的那个对象的引用计数会被+1,当array本身释放时,它会先给array中的所有对象发一个release消息。

可以用Instruments检测内存泄露,里各种各样的工具,用Leaks。

用起来很简单:用Xcode(4.3)打开相应的项目,Product->Profile,选Leaks工具。 之后会动态地记录应用运行过程中,有哪些地方出现内存泄露。 需要注意的地方有二:

1 对于被autorelease的对象,Leak工具也会视其为泄露,自己知道没问题就行。

2 记得点开Extended Detail ,对于每一出泄露,可以在这里看到调用堆栈,双击调用堆栈中的某一项,可以直接定位到代码,便于查错跟修改。 情况如下两个图:

本文出自 “我已成妖” 博客,请务必保留此出处http://dawn110110.blog.51cto.com/3049492/899283

时间: 2024-08-26 12:20:42

用Instruments检测内存泄露的相关文章

Instruments(检测内存泄露)简介

Instruments中文文档下载地址:http://cc.cocimg.com/bbs/attachment/Fid_6/6_24457_90eabb4ed5b3863.pdf 或许很多人对Instruments应用不太了解,但可能很多老的iOS开发者都应该用过 Instruments工具来检测iOS应用内存泄漏情况.特别是在iOS 5.0之前,即苹果在iOS平台上面还没支持ARC的时候,写iOS应用就类似C语言那样,容易忘记释放内存,而内存对移动设备而言是非常可贵的.即使目 前iPhone设

xcode里面使用Memory Leaks和Instruments检测内存泄漏

教程截图: Leaks和Instruments教程[检测内存泄露]" src="http://pic002.cnblogs.com/images/2011/283130/2011080816513182.jpg"> 作为一名无证程序员,无论你多么精通Objective-C的内存管理,随着时间的推移,你也不可避免的犯内存相关的错误.但通常因为代码量太大,以至于你不可能一行一行的去排除(等你解决完,你设计的动车早相撞了!) 幸运的是,苹果已经提供了一些好的方式来帮助你找到应

使用新版Android Studio检测内存泄露和性能

内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具,LeakCanary插件,一切就变得so easy了. 熟悉Android Studio界面 工欲善其事,必先利其器.我们接下来先来熟悉下Android Studio的界面  PHPer月薪测试题 [点击进入] 看看自己工资拿少

Android Studio检测内存泄露和性能

韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha [email protected] 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中. 一般情况下,高密度的手机,一个页面大概就会消耗20M内存,如果发现退出界面,程序内存迟迟不降低的话,可能就发生了严重的内存泄露. 我们可以反复进入该界面,然后点击dump java heap 这个按钮,然后Android Studio就开始干活了,下面的图就是正在dump  dump成功后会自动打开 hprof文件,

vs2010使用vld检测内存泄露

cocos2d-x不仅可以做到跨平台运行,还可以做到跨平台编译调试(当然只是编译对应平台下的应用了).众所周知,cocos2d-x是用c++编写的,而c++中最让人头疼的莫过于指针和内存泄露的问题,在windows下,cocos2d-x支持在vs下开发,这样,平时写win32项目的开发工具就可以用在cocos2d-x开发上了,善哉!今天就介绍一个检测内存泄露的工具,Visual Leak Detector,简称 vld 1.安装 这一步很简单,官网已经在上面给了,直接download吧,跳过!

深度分析内存泄漏原因,使用MAT工具检测内存泄露和性能

造成内存泄漏原因: 场景一:静态变量导致的内存泄漏 例如:mainactivity中 private static context scontext: @override protected void oncreat(bundle savedinstancestate){ ............................................. scontext=this; } 泄漏点:静态变量scontext引用,activity无法正常销毁 场景二:单例模式导致的内存泄漏

在iOS上自动检测内存泄露

手机设备的内存是一个共享资源.应用程序可能会不当的耗尽内存.崩溃,或者遭遇大幅度的性能降低. Facebook iOS客户端有很多功能,并且它们共享同一块内存空间.如果任何特定的功能消耗过多的内存,就会影响到整个应用程序.这是可能发生的,比如,这个功能导致了内存泄露. 当我们分配了一块内存,并设置了对象之后,如果在使用完了之后忘记释放,这就会发生内存泄露.这意味着系统是无法回收内存并交予他人使用,这也最终意味着我们的内存将会逐渐耗尽. 在Facebook,我们有很多工程师在代码库的不同部分上工作

Android性能优化第(二)篇---Memory Monitor检测内存泄露

上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出来.性能优化的重要性不需要在强调,但是要强调一下,我并不是一个老司机,嘿嘿!没用过这个工具的,请睁大眼睛.如果你用过,那么就不用在看这篇博客了. 先看一段会发生内存泄露的代码 public class UserManger { private static UserManger instance;

Android 使用LeakCanary 检测内存泄露

LeakCanary 是 Android 和 Java 内存泄露检测框架,该框架是Square公司的一个开源库,项目地址 leakcanary . Android 开发中你是否频频遇到内存泄露而无奈无从解决.说不定哪天你不小心写的一行代码就导致了内存泄露.可以先看看这些问题导致的内存泄露 Android开发编码规范导致的内存泄露问题,而LeakCanary 则很直白得检测出了内存泄露并展示给我们.在使用它之前,我们来写一个例子. 本地广播,在开发中还是有一定的应用的,现在有这么一个需求,要求使用