iOS开发 如何检查内存泄漏

本文转载至 http://mobile.51cto.com/iphone-423391.htm

在开发的时候内存泄漏是不可避免的,但是也是我们需要尽量减少的,因为内存泄漏可能会很大程度的影响程序的稳定性!!!最近一阵在疯狂的查询内存泄漏问题,总结有几种方法供大家参考。

AD:2014WOT全球软件技术峰会北京站 课程视频发布

在开发的时候内存泄漏是不可避免的,但是也是我们需要尽量减少的,因为内存泄漏可能会很大程度的影响程序的稳定性!!!最近一阵在疯狂的查询内存泄漏问题,总结有几种方法供大家参考。

1.静态分析 

通过静态分析我们可以最初步的了解到代码的一些不规范的地方或者是存在的内存泄漏,这是我们第一步对内存泄漏的检测。当然有一些警告并不是我们关心的可以略过。

2.通过instruments来检查内存泄漏

这个方法能粗略的定位我们在哪里发生了内存泄漏。方法是完成一个循环操作,如果内存增长为0就证明我们程序在该次循环操作中不存在内存泄漏,如果内存增长不为0那证明有可能存在内存泄漏,当然具体问题需要具体分析。

3.代码测试内存泄漏

在做这项工作之前我们要注意一下,在dealloc的方法中我们是否已经释放了该对象所拥有的所有对象。观察对象的生成和销毁是否配对。准确的说就是 init(创建对象的方法)和dealloc是否会被成对触发(简单说来就是走一次创建对象就有走一次dealloc该对象)。

下面是自己遇到的一些比较隐秘的造成内存泄漏的情况:

1.两个对象互相拥有:也就是说对象a里面retain/addSubview了b对象,b对象同时也retain/addSubView了a对象。注意:delegate不要用retain属性,要用assign属性也会导致互相拥有。

2.有时候需要用removeFromSuperView来释放:具体说明,也许我的a对象拥有一个b对象,b对象add到了c对象上,而在我们的设计中b对象的生命周期应该和a对象相同;这时候只一句[b release]/self.b = nil是不能把b对象释放掉的(一般情况下release会使其retainCount-1,[super dealloc]会再次将所有subView的retainCount-1,而b并不是a的subView,所有最后的一次-1没有了);所以我们需要在之前加上[b removeFromSuperView]。

希望大家都一起分享一下自己遇到过的比较隐秘的内存泄漏方式。

时间: 2024-10-12 14:46:18

iOS开发 如何检查内存泄漏的相关文章

Android开发 |常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. 内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一.由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如

用mtrace检查内存泄漏

http://blog.csdn.net/ixidof/article/details/6638066内存泄漏检查方法(for Linux) 如果你更想读原始文档, 请参考glibc info的"Allocation Debugging" 一章 (执行info libc);glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数 分配内存(如malloc, alloc...): 1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mc

UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏

因为.NET的垃圾回收机制相当完善,通常情况下我们是不需要关心内存泄漏的.问题人一但傻起来,连自己都会害怕,几个页面跳啊跳的,内存蹭蹭的往上涨,拉都拉不住.这种时候我们就需要冷静下来,泡一杯热巧克力.再打开Visual Studio 2015的Diagnostic Tools,来检查下到底哪段代码出了问题. 我们先创建一个简单的UWP工程,该工程只有2个几乎为空的Page.MainPage只有两个按钮,分别用来跳转到SecondPage,以及调用GC.Collect()方法.而SecondPag

valgrind 检查内存泄漏

内存泄漏是coding中经常容易出现的问题, 而且很难查. 本文中总结了几个常见的内存泄漏问题, 分别举例实现, 并列出用代码分析工具--valgrind中memcheck检查的结果, 一 一对错误进行排查. 本文围绕工程valgrind-sample进行讲解. 先看下工程结构: methods类写了几个可能存在内存操作问题的函数, main.cpp调用methods类函数: methods.h: #ifndef VALGRIND_METHODS_H #define VALGRIND_METHO

【iOS开发-116】内存测试管理和优化:Analyze和Profile,以及iOS开发常用工具simPholders、fabric

(1)关于Analyze和Profile的使用和介绍 --使用,长按左上角的Run,会出现Analyze和Profile两个选项.Analyze是静态内存分析,如果有潜在的内容泄露问题会出现蓝色的标记.Profile是动态内存分析,这个比较详细一点,可以看到程序的每个模块占用多少内存等等. 推荐的博客: IPhone开发工具篇-利用xcode profile和analyze进行性能优化 备注:自从有了ARC,内存泄露问题大大减少了,但不代表没有.对内存有疑问或者对于老项目从非ARC转ARC有困难

检查内存泄漏

1.分配空间 2.记录内存块信息 3.调用构造函数(类型萃取) #include<iostream> #include<string> #include<list> #include<assert.h> using namespace std; struct BlockInfo { void* _ptr; string _file; int _line; BlockInfo(void *ptr, const char*file, int line) :_pt

Cocos2d-x Win32中使用Visual Leak Detector (for VC++)检查内存泄漏

Visual Leak Detector(vld,下载地址http://vld.codeplex.com/,当前版本v2.2.3)是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具,相较于VC提供 的CRT Debug Library,vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld具有以下一些特性: 对每个leaked block提供完整的堆栈跟踪,并且包含其源文件及行号信息(符号信息完整时) 能检测出进程内绝大多数类型的leaks,包括COM-based leaks和纯Win3

iOS 简单的 block &amp; 内存泄漏问题

注意 : block 用 copy 引用  typedef int (^MyBlock)(int, int); void play() { NSLog(@"play mp3"); } int main(int argc, const char * argv[]) { @autoreleasepool { MyBlock sumBlock =  ^(int a, int b){ return  a + b; }; MyBlock minusBlock =  ^(int a, int b)