iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使用,最后收到didReceiveMemoryWarning,最终导致程序崩溃。以下是开发过程中遇到的一些问题和网上的一些资料,总结了一下:

一、[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用

用UIImage加载本地图像最常用的是下面三种:

1.用imageNamed方法

[UIImage imageNamed:ImageName];

2.用 imageWithContentsOfFile 方法

NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];
UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];

3. 用initWithContentsFile方法

UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]

第一种方法为常见方法,利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。

第二种方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。

第三种方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。

二、 滑动列表的时候,使用UITableView的reuse机制

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; }

dequeueReusableCellWithIdentifier 方法会把隐藏的界面拿来重用,这样节省很多资源。

三、要大量创建局部变量的时候,可以创建内嵌的autorelease pool来及时释放内存

int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i, j;
for (i = 0; i < 100; i++ )
{NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];for (j = 0; j < 100000; j++ )[NSString stringWithFormat:@"1234567890"];//产生的对象是autorelease的。
 [loopPool release];
}
[pool release];
return (0);
} // main

详细查看:iPhone/Mac Objective-C内存管理教程和原理剖析(一)基本原理

四、频繁打开和关闭SQLite,导致内存不断的增长

SQLite的数据库本质上来讲就是一个磁盘上的文件,频繁打开和关闭是很耗时和浪费资源的,可以设置SQLite的长连接方式;避免频繁的打开和关闭数据库;

五、在UITableView 的cellForRowAtIndexPath 代理中不要使用 stringWithFormat 方法

定义一个字符串变量有很多方法,最简单的就是 NSString *str = @“abc”, 还有initWithString、stringWithFormat和stringWithCString等等。大量的字符操作时,不同的方法消耗不同的内存。

以下测试代码转自:http://www.cocoachina.com/bbs/read.php?tid-17652-fpage-9.html

//测试机器 2.4 GHz Intel Core 2Duo    2GB 667 MHz DDR2   GCC 4.2- (void)testStringSpeed:(id)sender
{NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];[textField setStringValue:@""];int testi,testnum=10;float c,tm=0.0;for(testi=0;testi){NSDate *beg=[NSDate date];int i,n=10000000;for(i=0;i){//avg=0.030204}c=[[NSDate date] timeIntervalSinceDate:beg];tm+=c;[textField setStringValue:[NSString stringWithFormat:@"%@\n%d=%f",[textField stringValue],testi+1,c]];}[textField setStringValue:[NSString stringWithFormat:@"%@\navg=%f",[textField stringValue],(float)tm/testnum]];[pool release];
}

 

由于stringWithFormat 即耗时又耗内存,所以在cellForRowAtIndexPath 绘制cell 的时消耗大量内存和时间,造成界面滑动不流畅。

六、关于 colorWithPatternImage 的内存泄露

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg.png"]];

此方法用图片来设置view的背景颜色,但是某些设备上会导致内存泄露,详细查看:

http://blog.csdn.net/cococoolwhj/article/details/6942981

http://www.cocoaintheshell.com/2011/01/colorwithpatternimage-memory-usage/

ios代码中的内存泄露,内存检测工具leaks 检测不出来相关推荐

  1. iOS开发之内存泄漏检测工具-Leaks

    引言 我们在实际开发过程中,经常会不小心造成循环引用问题,从而造成内存泄漏问题,那么我们该如何检测我们工程那个位置存在内存泄漏问题呢?这就需要用到Xcode自带的内存泄漏检测工具-Leaks. 内存泄 ...

  2. QT调试技巧-使用静态代码检测工具Cppcheck检测代码

    #QT调试技巧-使用静态代码检测工具Cppcheck检测代码 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 环境: Qt Creat ...

  3. 另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测)

    标 题:   [原创]另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测) 作 者: 堕落天才 时 间: 2007-04-14,11:09:49 链 接: http:// ...

  4. 微信开通检测工具如何检测效果最好

    微信开通检测工具如何检测效果最好 使用空号检测软件是挺难的,毕竟这是一款网络软件,是虚拟的,看不见也摸不着,使用空号检测软件其实又是挺轻松的,因为以音速空号检测软件为例,使用很简单,三步便可使用完成, ...

  5. WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存

    本内容为翻译微软的官方文档和一些国外的blog的内容,详细这些内容的原文可以参看 http://www.cnblogs.com/virusswb/archive/2009/11/05/1596495. ...

  6. Android内存泄露抓取工具leakcanary

    引言 "A small leak will sink a great ship." - Benjamin Franklin 概述 某些对象的生命周期有限,当它们的工作完成以后,将会 ...

  7. linux 进程内存分析工具,Linux内存使用情况以及内存泄露分析之工具与方法

    1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached. MemTotal:        5933132 ...

  8. 堆,栈,内存泄露,内存溢出介绍

    简单的可以理解为: heap(堆):是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 一. ...

  9. Pitest内存泄露分析 (工具使用IDEA、Jprofiler)

    目录 一.环境 二.概述 2.1变异测试整体流程 2.2内存溢出原因 主进程(设计问题) 子进程(CoverageMinion) 三.过程分析 3.1调试环境搭建 主/子进程远程调试 Jprofile ...

最新文章

  1. 百度语音合成 js html,Node.js结合百度TTS接口实现文字转语音功能
  2. linux死锁检测的一种思路【转】
  3. 莱比特矿池CEO江卓尔:BCH作为货币不需要新功能,但出于货币竞争的考虑需要
  4. MySQL数据库端字符集设置
  5. 高德软件测试工资,【高德工资】软件测试工程师待遇-看准网
  6. Android官方开发文档Training系列课程中文版:创建自定义View之View的优化
  7. expandablelistview 折叠动画_这个机械手到底有几个自由度,31个机械原理、设计动画来了。。。...
  8. Vue打包发布项目---vue工作笔记0020
  9. Qt ui-setupUi(this)的作用
  10. My PaintBrush Pro for mac(专业的绘图画板)
  11. Oracle P6培训系列:08创建WBS
  12. mysql同步 触发器_MySQL触发器运用于迁移和同步数据的实例教程
  13. Servlet的生命周期
  14. 【程序员如何买基金 一】基金的优势及分类
  15. 关于网页点击按钮无响应问题分析
  16. Linux基础知识小结(一)
  17. 我不想加班,您看我还有机会吗?
  18. 网络故障检查、PING命令使用(实测)
  19. 做好多项目管理的十个关键步骤(含工具)
  20. 【NDN实验】ndnSIM 2.0: A new version of the NDN simulator for NS-3 全文翻译

热门文章

  1. php reactphp wss_swoole 使用websocket建立wss连接
  2. auto.js B0012 进入各频道 查找父控件 子控件 2021-10-03
  3. java 构造方法 继承_java-继承/构造方法?
  4. 贝叶斯法则的举例分析
  5. 【实习日志】The last Day总结篇
  6. 完全平方公式用c语言表达式,完全平方公式教案
  7. 手机端或PC端利用高德地图和腾讯地图获取用户当前位置信息
  8. python爬取所有页url_Python 如何爬取相同url下,多个页面的链接内容
  9. 快收下这枚 Scrapy Requests 口味的爬虫“回魂丹”
  10. 开始→运行→输入的命令集锦(欢迎补充)