`
linwwwei
  • 浏览: 222858 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内存管理2(学习)

阅读更多

  1. 尽量少的UIView层
        通常我们喜欢把很多控件层(UILabel,UIButton,UIView等)一起放到一个大的UIView容器来显示我们的内容,这个方法一般是可以的,但是如果要经常重新刷新内容的大区域界面,多数发生在iPad的应用中,这个方法会带来过多的内存使用和动画的延迟(比较卡),例如,scrollview的动画比较卡,又或者,经常收到内存警告。其中一个重要原因是每个控件,特别是透明底的,会多次重新绘制(drawRect)过多。其解决办法是,尽量将几个控件合并到一个层上来显示,这样系统会减少系统调用drawRect,从而带来性能上的提升。
        很简单的一个例子,就是iNotes提供手写功能,用户可以在iPad屏幕上写出不同的笔画,开始的设计是,用户每写一划,iNotes就会生成一个新的透明底UIView来保持这个笔画,用户写了10笔,系统就生产了10个UIView,每个view的大小都是整个屏幕的,以便用户的undo操作。这个方案带来严重的内存问题,因为系统将每个层都保持一个bitmap图,一个像素需要4bit来算,一个层的大小就是 4x1024x768 ~ 3M, 10个层就是 10x3M = 30M,很明显,iPad很快爆出内存警告。
        这个例子最后的方案是,所有笔画都画在同一个层,iNotes可以保存笔画的点进行undo操作。这样的方案就是无论用户画多少笔画,界面重画需要的资源都是一样的。
  2. 显示最佳尺寸的图片
        很多程序员比较懒,网络上拿下来的图片,直接就用UIImageView将其显示给用户,这样的后果就是,程序需要一直保存着大尺寸的图片到内存。解决办法应该是先将图片缩小到需要显示的尺寸,释放大尺寸图片的内存,然后再显示到界面给用户。
  3. 尽量使用图片pattern,而不是一张大的图片
        例如,很多界面设计者喜欢在界面上放一个大底图,但这个底图是老是占用着内存的,最佳方案是,设计出一个小的pattern图,然后用这个方案显示成底图。
       
    UIImage *smallImage = [[UIImage alloc] initWithContentsOfFile:path];
        backgroundView.backgroundColor = [UIColor colorWithPatternImage:smallImage]; 
        [smallImage release]; 
  4. 使用完资源后,立即释放
        一般objective-c的习惯是,用完的资源要立即释放,因为明白什么时候用完某个资源的是程序员你自己。例如,我们要读较大的图片,把它缩小后,显示到界面去。当大图片使用完成后,应该立即释放。代码如下:
       
    UIImage *fullscreenImage = [[UIImage alloc] initWithContentOfFile:path]; 
        UIImage *smallImage = [self resizeImage:fullscreenImage];
        [fullscreenImage release];       
        imageView.image = smallImage; 
         
        ...... 
  5. 循环中大量生成的自动释放autorelease对象,可以考虑使用autorelease pool封装。代码范例:
        for(UIView *subview in bigView.subviews) { 
            // 使用autorelease pool自动释放对象池 
            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
         
            UIImageView *imageView = (UIImageView *)subview; 
             
            // subview处理代码 
            ....... 
         
            // 销毁自动释放对象 
            [pool  drain]; 
        } 
    自动释放对象池把每个循环内生成的临时对象使用完后立即释放

    以上的意见是本人多年来编写iPad/iPhone程序的经验,另外iOS4.0的multi-tasking特性发布后,程序可以被调入后台运行,苹果 工程师的意见是,进入后台运行时,你的应用应该释放掉能释放的对象,尽量保持在16M左右,这样别的程序运行时才不容易把你的应用挤掉。

分享到:
评论

相关推荐

    内存管理源代码-内存管理源代码

    这份"内存管理源代码"提供了深入理解内存管理机制的宝贵资料,对于想要自己编写操作系统或者正在改进无内存管理系统的人来说,具有很高的参考价值。 在操作系统设计中,内存管理的目标主要有三个:防止内存碎片、...

    操作系统实验实验四 模拟内存管理程序

    通过模拟内存管理程序,学生可以学习如何设计和实现一个基本的内存管理系统,包括内存分配和释放的机制。 内存管理是操作系统中一个非常重要的组件,它负责管理计算机的内存资源,确保程序的正确执行。内存管理系统...

    《深入理解LINUX内存管理》学习笔记a.PDF

    《深入理解LINUX内存管理》学习笔记a.PDF

    内存管理内幕 pdf

    ### 内存管理内幕知识点详解 #### 一、引言 《内存管理内幕》是一份针对Linux程序员的技术文档,尤其适合C语言开发者。...《内存管理内幕》提供了一个全面深入的学习资源,帮助读者掌握内存管理的关键技术和最佳实践。

    操作系统内存管理实验报告

    操作系统内存管理实验报告的核心是探讨分页存储管理和虚拟内存的实现,特别是请求页式存储管理以及FIFO(先进先出)页面淘汰算法的应用。实验旨在通过编写和调试模拟程序,帮助理解存储管理方案,熟悉虚存管理的页面...

    linux内存管理实验报告

    Linux内存管理是操作系统的核心组成部分,它负责...实验总结表明,通过实践操作,学生对Linux内存管理有了更深入的理解,并且能够应用于实际问题中,这对于未来深入学习操作系统和其他系统级编程有着积极的推动作用。

    博客实验2正篇——内存管理

    综上所述,这个博客实验2深入探讨了内存管理的关键概念和实现,通过代码和图表帮助学习者理解和掌握这一重要领域。通过研究提供的资源,不仅可以提升对内存管理的理解,还能提升实际编程和系统设计的能力。

    《深入理解LINUX内存管理》学习笔记c.PDF

    《深入理解LINUX内存管理》学习笔记c.PDF

    Cocos2D-X2.2.3学习笔记3(内存管理)

    在Cocos2D-X2.2.3的学习过程中,内存管理是至关重要的一个环节,它直接影响到游戏的性能和稳定性。Cocos2D-X是一个跨平台的2D游戏开发框架,使用C++作为主要编程语言,并支持Lua和JavaScript。本笔记将深入探讨Cocos...

    linux学习资料——内存管理

    在Linux操作系统中,内存管理是其核心功能之一,它对系统的稳定性和性能有着至关重要的影响。本资料将深入探讨Linux内核如何进行内存管理和映射,以帮助你更好地理解和优化Linux系统。 首先,Linux内存管理的目标是...

    《深入理解LINUX内存管理》学习笔记b.PDF

    《深入理解LINUX内存管理》学习笔记b.PDF

    C和C++内存管理资料(包括内存管理-内存泄漏-内存调试-内存检测方法)

    在IT领域,C和C++是两种非常重要的编程语言,它们以其高效性和灵活性深受程序员喜爱...通过学习这些材料,你可以更好地掌握内存管理的原则,预防和解决内存泄漏,以及有效地进行内存调试和检测,从而提升你的编程技能。

    C#内存管理介绍

    C#内存管理,确切的说是.net 内存管理,学习后的总结。

    内存管理 作者李云

    2. **内存回收**:当程序不再需要内存时,内存管理系统必须回收这些资源,以便再次分配。这个过程称为垃圾回收。在现代操作系统中,常见的垃圾回收算法有引用计数法、标记-清除法、复制算法、分代收集等。 3. **...

    深入理解LINUX内存管理学习笔记

    2,一直以来学习LINUXkernel的知识缺乏系统化,借对这本书的学习,系统化 的学习一下LINUXkernel。 3,自己一直在做一个toosmall,toosimple的单进程,特权模式,64bit保 护模式的称不上OS的OS,已经做完了...

    Delphi快速内存管理 ScaleMM

    《Delphi快速内存管理:揭秘ScaleMM》 在Delphi编程世界中,内存管理...通过理解并利用ScaleMM的特性,开发者可以构建更加高效、稳定的应用程序,同时,它的开源属性也为我们提供了深入学习和改进内存管理策略的机会。

    内存管理2dephi源代码.rar_dephi_内存管理

    本资源“内存管理2dephi源代码.rar”提供了一组基于Delphi的内存管理实现示例,有助于开发者深入学习这一主题。 Delphi,作为一个强大的Object Pascal开发环境,其内存管理机制基于.NET框架的垃圾收集(Garbage ...

    动态分区内存管理 C++实现

    内存管理是计算机科学中的核心概念,特别是在编程语言如C++中。动态分区内存管理是一种用于在程序运行时分配和释放内存的方法,它允许程序根据需要动态地调整内存使用。本主题将深入探讨动态分区内存管理的基本原理...

    内存管理方面x86,LINUX下的内存管理方式

    在IT领域,内存管理是操作系统的核心组成部分,尤其是在x86架构下的Linux...通过阅读《lecture8.pdf》、《lecture6.pdf》、《lecture7.pdf》和《lecture5.pdf》等文档,可以更深入地学习和理解Linux内存管理的细节。

Global site tag (gtag.js) - Google Analytics