http://hi.baidu.com/spopavenvldiqyr/item/c8d620b6282c4d4abb0e122a
iphone内存管理(一)

BY 洋葱头

http://hi.baidu.com/yangcong121/home

内存管理在iphone中一直是一个热点话题。通过一段时间的总结我准备与大家分享一下我对内存管理的一点认识和经验.

开始之前先给大家分享一些重要的信息

1。Iphone 3g有128M的内存。但是至少有一半已经用来运行OS了。这意味着你的程序可能只有区区40M的空间让你使用。但是请记住:你可能会在你程序只使用了3M时就收到一个内存警告.

2。iphone并不使用类似C#的垃圾回收机制,

3。内存管理的基本原则:每一个 alloc,retain,copy你都需要自己去release

4。Objective-C runtime实例化一个对象只会在栈上而不会在堆上。

5。你可以使用autorelease对象,但是要注意的是这种对象如果不将它的内存池release它是不会释放掉的.它可能造成一个很大的内存泄露。但是你用leak又查不出来。

6。iphone没有交换文件系统,所以也就没有虚拟内存.

下面是一些建议

1.回应内存警告

2.尽量避免使用autorelease

3.使用延迟加载和再利用

4.如果图大且同一张图使用次数不多就避免使用imageNamed

5.table cell妥善使用再利用机制

6.使用Instruments

7.使用静态分析工具

8.使用NSZombieEnabled检测错误详情

以下我将对上面的建议意义详细讲述

(1)回应内存警告

千万不要忘了调用如下代码,这是最简单的形式。如果你有其他需要释放内存的地方你可以写在里面.

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

}

而最好最后能通知到application delegate中。然后调用如下

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

{

[[ImageCache sharedImageCache] removeAllImagesInMemory];

}

这样可以清除缓存的图片。得以缓解紧张的内存使用情况.

当然,你需要调用如下代码来申请这个通知

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

[center addObserver:self

selector:@selector(whatever:)

name:UIApplicationDidReceiveMemoryWarningNotification

object:nil];

=============================================================================

http://ihuby.info/2011/07/18/ios%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/

iOS开发经验总结—内存管理

by ADMIN on JULY 18, 2011 · LEAVE A COMMENT

iOS 开发中的一个重要部分就是关于内存的使用管理,用的不好就容易就产生内存泄露或内存错误访问,造成软件的崩溃,影响产品的使用和用户体验。在团队协调开发中也整理过了一些开发规范,正好看到国外的一篇开发博客文章“10-iphone-memory-management-tips”,其重要列表部分我翻译并整理一下。

一些重要的背景知识点:

  1. iPhone3G只有128M RAM内存,至少有一半是要留给操作系统;也即大概只有很小的40M内存左右留给了应用程序… 另外请记住,即使你开发的应用只使用了3M内存的时候,也有可能收到系统的内存警告通知。(Huby注:3GS内存总大小是256M,应用程序能使用大概不到80M;而iPhone4的内存大小是512M,应用程序能使用大概180M左右。而Apple对一个App设定的限额一般是20M)
  2. iPhone 不使用垃圾回收机制,即使Objective-C 2.0中有垃圾回收机制可使用(用Objective-C 2.0开发Leopard上的App可使用垃圾回收)。
  3. 内存管理的基本原则是:任何一处对象只要调用了 [ alloc | retain | copy ]一次,就必须在代码某处有一一对应执行相应的 [release] 方法。
  4. Objective-C 运行时的对象实例都是在堆(Heap)中,不允许在栈(stack)中创建实例对象;这意味着没有自动化对象,也没有智能指针对象帮你管理内存。
  5. 对象可以使用 autorelease 方法,但是要当心,这些对象必须等到他们的内存池自动释放的时候才能释放,如果内存池没有释放,其实也就相当于仍然产生了内存泄露。
  6. iPhone没有内存交换文件(swap file),所以也就没有虚拟内存概念。当系统没有更多内存可用的时候,那么就真的是没有了。

经验总结:

  1. 要写代码处理iOS系统的内存警告通知。
  2. 尽量避免使用对象的内存自动释放机制。
  3. 使用延迟加载创建对象以及内存对象的重用机制。(注: 横向或纵向滚动列表中特别适用)
  4. 尽量避免使用UIImage的imangeNamed方法。(注:这样就等于使用了系统内存自动释放机制)
  5. 自绘Table Cell并适当重用。
  6. 重写属性的Setter方法。
  7. 小心使用委派(Delegation)机制。
  8. 使用Instruments工具优化内存使用。
  9. 使用代码静态分析工具优化代码。
  10. 启用NSZombieEnabled可发现更多内存问题。

iphone内存管理相关推荐

  1. iPhone内存管理详细解说(二)

    继上一篇之后,再来讲述iPhone内存管理的细节. 四:动态内存管理 第四节就内容实质来说跟第三节的object的拥有和丢弃政策是一样的,不过是从以代码为引导的动态形式讲述.所以你会在这一节看到许多代 ...

  2. iPhone内存管理详细解说(一)

    iPhone内存管理详细解说系列转载来源:http://keywind.me/blog/2011/05/07/iphonenei-cun-guan-li-xiang-xi-jie-shuo-yi/ 感 ...

  3. iphone内存管理(一)

    内存管理在iphone中一直是一个热点话题.通过一段时间的总结我准备与大家分享一下我对内存管理的一点认识和经验. 开始之前先给大家分享一些重要的信息 1.Iphone 3g有128M的内存.但是至少有 ...

  4. iphone内存管理(二)

    (2)尽量避免使用autorelease 虽然autorelease非常简单有用,但是在iphone上一定要谨慎使用,毕竟iphone内存相当有限.autorelease可能会导致直接的隐型内存泄露. ...

  5. ipad/iphone内存管理一

    在我们iPhone/iPad项目中,程序会无缘无故地crash!这让我们非常的苦恼!现在我结合网上的一些资料,并根据自己的理解,和大家一起探讨内存管理这方面的知识.大家有什么不理解的可以直接给我留言. ...

  6. iphone 内存管理2

    iPhone 开发过程中,内存的使用至关重要.不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃.根据个人开发的经验来看,在开发iPhone程序的过程中,关于内 ...

  7. iphone内存管理的具体问题解决方案

    iPhone 开发内存管理 开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有m ...

  8. iphone 内存管理1

    开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有memory leak ,杀掉 ...

  9. iPad/iPhone内存管理四之viewDidUnload/dealloc详细解说

    在进行内存管理时,我们必须要知道这两者的区别时什么. viewDidUnload是在程序接到内存警告的时候调用的,在这时候,我们可以把我们不需要的东西去掉或者让他等于nil. dealloc是在计数等 ...

最新文章

  1. android 伸缩工具栏,看,这个工具栏能伸缩折叠——Android CollapsingToolbarLayout使用介绍...
  2. python whl是什么文件
  3. Java异常中受检异常非受检异常与RuntimeException异常关系
  4. 如何用好云原生数据湖?
  5. 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
  6. jpa语法错误_JPA陷阱/错误
  7. 经典面试题(8):关于逻辑运算符,下面代码运行的结果是什么?
  8. C++ – 第一次作业
  9. 牧马人鼠标g13鼠标宏_达尔优第五代牧马人EM915游戏鼠标评测
  10. Portal for ArcGIS 资源承载数据类型
  11. php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
  12. n 维欧式空间中正交向量组的扩充
  13. Vue全家桶 之 KTV前台收银管理系统 (不想努力啦,回家收钱去)
  14. H5游戏开发框架排名
  15. 《专注力--化繁为简的惊人力量》之创造力的30天
  16. matlab一维数组操作,Matlab创建一维数组的具体操作讲解
  17. 2022-2028年中国高通量药物筛选与创新药物行业市场调查研究及发展前景展望报告
  18. andorid xmlns:tools=“http://schemas.android.com/tools“是用来做什么的?
  19. alert promt confirm js 用法
  20. 【水滴石穿】ES must与should组合使用的正确方式

热门文章

  1. Vue-nginx反向代理
  2. 通信值勤维护管理条例_加强固定通信台站值勤管理与建设的探讨
  3. 2015年2月训练随笔
  4. java 元注解 @Retention @Inherited @Documented
  5. R语言ggplot2——“Windows字体数据库里没有这样的字体系列”;更改字体
  6. 聊聊算法,AI算法和传统算法
  7. 我的世界多人在线服务器,我的世界2b2t服务器-1.16.X网红多人在线生存服务器
  8. 2.4G芯片做蓝牙广播发送数据(伪蓝牙)
  9. Java中Arrays类的常用方法
  10. python智能模块_Python模块常用的几种安装方式