iphone内存管理

news/2024/10/17 12:32:26/

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 开发中的一个重要部分就是关于内存的使用管理,用的不好就容易就产生内存泄露或内存错误访问,造成软件的崩溃,影响产品的使用和用户体验。在团队协调开发中也整理过了一些开发规范,正好看到国外的一篇开发博客文章“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可发现更多内存问题。


http://www.ppmy.cn/news/662960.html

相关文章

android 内存至少一半,极客修:为什么iPhone比安卓内存小,却更流畅?

原标题:极客修:为什么iPhone比安卓内存小,却更流畅? 文/极客修小编 即使到今天,iOS和Android之间的战争依然强劲。 显然双方都有各的拥护者,但这并不能阻止大家继续比较两者优劣,看看哪一个更符合我们的需求。 极客君之前已经探讨了iOS系统通常比Android系统使用周期更长…

iPhone 重大缺陷 存储空间耗尽后无法正常开机

问题描述 今天下午接了一个电话,讲到一半电话没声了。 挂断电话之后,去电话里,却找不到刚刚的通话记录。 虽然挂断了电话,但此时显示电话仍在使用麦克风,屏幕右上角有小红点。 感觉不太对劲,按关机却没有…

iPhone开发Swift基础07 内存泄漏检测

Instruments Instruments工具是用于动态跟踪和分析代码的工具,可以跟踪一个或者多个进程,并检测收集实时数据,使开发者更好地理解应用程序和操作系统的行为和性能。 追查代码中难以重现的问题对应用程序进行性能分析自动化测试应用程序中的…

是省还是亏?手工升级iPhone内存存在“后遗症”!...

除了不能享受保修,这种操作本身也存在风险。 没有32G版的iPhone一直是苹果的槽点,16G版的iPhone内存不够用,64G版的又贵了不少。最近,一些手机维修门店以及万能的淘宝已经提供手工升级iPhone内存的服务了。手工增加iPhone内存貌似…

iPhone内存比Android手机小,iPhone内存为什么一直这么小

近年来,和国产安卓手机的“慷慨”相比,iPhone的内存始终相当“吝啬”,最新发布的iPhone 11系列也不过4GB内存,甚至不如国产千元机。不过由于iOS的流畅度有口皆碑,曾经2GB iPhone干法6GB甚至8GB安卓手机是常有的事儿。 …

iPhone13内存不够怎么解决 iPhone13显示内存不足怎么办

iPhone13为用户提供了128、256和512三个存储版本,用户可以根据自己的实际使用需求来进行购买,下面小编带来iPhone13内存不足的4种解决方法 iPhone13为用户提供了128、256和512三个存储版本,用户可以根据自己的实际使用需求来进行购买,不过存储空间越大,软件占用的内存也会…

《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【Django】如何在django模型中添加一个*后面的必填字段

form.py 会被单独访问的字段(如使用{{form.as_p}}),然后可以将属性添加到您的ModelForm required_css_class = ‘required’ class MyForm(forms.Form):required_css_class = required这将定义的所有领域需要为具有“必要”类 然后你就可以使用CSS添加星号: test.html …