`
GeekDuke
  • 浏览: 2338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

iOS开发 内存问题

阅读更多
在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开发内存分配图示

    ### iOS开发内存分配详解 #### 一、内存分配概述 在iOS开发中,理解内存管理是至关重要的。本文档将详细介绍iOS开发中的内存分配机制,包括不同区域的内存分配方式及其特点。 #### 二、虚拟内存与物理内存 在iOS...

    ios开发内存管理

    ios移动开发的内存管理ppt,讲的不错,你值得拥有

    iOS开发进阶-完整版

    根据提供的信息,我们可以推断出这是一本关于iOS开发进阶的书籍,作者为唐巧。虽然提供的部分内容似乎并不是实际的章节内容,但从标题、描述和标签中,我们可以推测本书可能涵盖的一些关键知识点。 ### iOS开发进阶...

    精通IOS开发 第7版 归档文件

    《精通iOS开发 第7版》是一本深入探讨iOS应用程序开发的专业书籍,其归档文件包含了丰富的源代码和资源文件,旨在帮助开发者深入了解并熟练掌握iOS平台的开发技术。这一版本聚焦于最新的iOS版本,提供了全面的更新和...

    IOS开发指南(第5版) pdf下载地址

    《iOS开发指南(第5版)》是一本深入探讨iOS应用程序开发的专业书籍,旨在帮助开发者从零基础到熟练掌握Apple的移动操作系统上的应用构建过程。该书第五版更新了最新的开发技术和工具,确保读者能够使用最新的Xcode和...

    ios加载图片内存暴涨解决方法

    在iOS开发中,加载大图或过多图片可能会导致应用程序内存飙升,从而引发性能问题甚至App崩溃。本篇文章将深入探讨如何解决"ios加载图片内存暴涨"的问题,主要介绍三种策略:第一种是使用UIKit的`setImage`方法,第二...

    ios开发详解markdown格式

    ### iOS开发详解 #### 一、iOS开发概述 iOS开发是指为苹果公司的移动操作系统iOS创建应用程序的过程。iOS操作系统主要用于iPhone、iPad以及iPod Touch等设备。为了开发iOS应用,开发者通常会使用两种主流的编程...

    IOS开发

    iOS 开发概述 iOS 开发是指使用 Objective-C 语言在 Mac 系统上使用 Xcode 开发工具进行移动应用程序开发的过程。下面将从环境需求、环境搭建、开发语言三个方面对 iOS 开发进行详细介绍。 一、环境需求 iOS 开发...

    ios程序 内存优化记录LOG日志-20130112

    首先,Instrument是iOS开发中的一个强大的工具,它可以用于检测应用程序的内存使用情况、性能瓶颈以及其他问题。通过监控Log日志,开发者可以发现内存消耗的峰值以及与之相关的代码行,以便进行优化。 在提供的部分...

    IOS官方开发手册

    作为iOS开发的基石,这份手册是每个开发者不可或缺的参考资料。下面,我们将详细探讨其中的主要内容。 首先,iOS开发的核心是Objective-C和Swift编程语言。Objective-C是早期的苹果开发语言,其语法基于C语言,加入...

    iOS开发进阶篇-成为一个iOS开发高手

    在iOS开发领域,掌握进阶技术是提升个人技能的关键步骤,这将使你从众多开发者中脱颖而出。"iOS开发进阶篇-成为一个iOS开发高手"这份资料正为此目标提供了全面的指导。它深入探讨了iOS开发的核心概念和技术,旨在...

    Xamarin iOS开发实战中册

    《Xamarin iOS开发实战中册》是一本专为开发者准备的深入学习Xamarin技术,特别是针对iOS平台的应用开发指南。这本书旨在帮助读者掌握使用Xamarin工具集构建原生iOS应用程序的技能,从而实现跨平台的高效开发。...

    iOS开发规范指南.zip

    在iOS开发过程中,遵循一套规范和最佳实践是至关重要的,这不仅能够提高代码质量,还能增强团队间的协作效率。这份“iOS开发规范指南”涵盖了多个关键领域,包括编程语言、项目结构、命名约定、错误处理、性能优化...

    UnityAndroid/iOS查看真机内存使用情况插件

    在Unity引擎中开发Android或iOS应用时,了解游戏或应用的内存使用情况是至关重要的。内存管理对于优化性能、防止内存泄漏以及确保应用程序稳定运行至关重要。"UnityAndroid/iOS查看真机内存使用情况插件" 提供了一种...

    北航iOS开发选修课pdf

    3. **Objective-C/Swift语言**:对比讲解两种iOS开发的主要编程语言,包括语法特性、面向对象编程原则、内存管理等。 4. **Cocoa Touch**:深入理解Apple的UI框架,包括UIView、UIViewController、Storyboard、Auto...

    ios开发视频教程链接.docx

    【iOS开发视频教程链接.docx】是一份针对初学者的iOS开发学习资源,旨在帮助完全不懂编程的小白逐步掌握iOS应用开发技术。本教程全面覆盖了iOS开发的基础知识到高级技巧,通过视频教学的方式,让学习过程更加直观...

    iOS内存泄漏检测器

    "iOS内存泄漏检测器"是一个实用工具,利用运行时机制帮助开发者在开发阶段就能检测出NSObject及其子类中的循环引用和其他内存泄漏问题,从而提高代码的健壮性和应用的稳定性。 首先,我们要理解内存泄漏的基本概念...

    iOS高级内存管理ARC模式手动模式英文文档含示例工程

    "crash调试"这部分可能涉及如何识别和解决由于内存问题导致的应用崩溃,这通常需要用到Xcode的调试工具,如Instruments,来分析内存分配和泄漏。 "反汇编"是另一个关键标签,它意味着这份资料可能深入到代码的底层...

    IOS开发斯坦福大学教程

    【iOS开发斯坦福大学教程】是一门面向进阶iOS开发者开放的高质量教学资源,由世界知名学府斯坦福大学提供。这门课程以其深入浅出的讲解和实践性强的项目,深受全球iOS开发者喜爱。结合中文字幕,使得国内的学习者...

    iOS 开发流程说明

    ### iOS开发流程说明 在移动应用开发领域,iOS平台因其庞大的用户基数、优秀的用户体验以及相对较高的用户付费意愿而备受开发者青睐。iOS应用开发主要依赖于苹果公司提供的Xcode集成开发环境(IDE)进行,该环境...

Global site tag (gtag.js) - Google Analytics