iOS开发经验总结—内存管理
From: 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”,其重要列表部分我翻译并整理一下。
一些重要的背景知识点:
- iPhone3G只有128M RAM内存,至少有一半是要留给操作系统;也即大概只有很小的40M内存左右留给了应用程序… 另外请记住,即使你开发的应用只使用了3M内存的时候,也有可能收到系统的内存警告通知。(Huby注:3GS内存总大小是256M,应用程序能使用大概不到80M;而iPhone4的内存大小是512M,应用程序能使用大概180M左右。而Apple对一个App设定的限额一般是20M)
- iPhone 不使用垃圾回收机制,即使Objective-C 2.0中有垃圾回收机制可使用(用Objective-C 2.0开发Leopard上的App可使用垃圾回收)。
- 内存管理的基本原则是:任何一处对象只要调用了 [ alloc | retain | copy ]一次,就必须在代码某处有一一对应执行相应的 [release] 方法。
- Objective-C 运行时的对象实例都是在堆(Heap)中,不允许在栈(stack)中创建实例对象;这意味着没有自动化对象,也没有智能指针对象帮你管理内存。
- 对象可以使用 autorelease 方法,但是要当心,这些对象必须等到他们的内存池自动释放的时候才能释放,如果内存池没有释放,其实也就相当于仍然产生了内存泄露。
- iPhone没有内存交换文件(swap file),所以也就没有虚拟内存概念。当系统没有更多内存可用的时候,那么就真的是没有了。
经验总结:
- 要写代码处理iOS系统的内存警告通知。
- 尽量避免使用对象的内存自动释放机制。
- 使用延迟加载创建对象以及内存对象的重用机制。(注: 横向或纵向滚动列表中特别适用)
- 尽量避免使用UIImage的imangeNamed方法。(注:这样就等于使用了系统内存自动释放机制)
- 自绘Table Cell并适当重用。
- 重写属性的Setter方法。
- 小心使用委派(Delegation)机制。
- 使用Instruments工具优化内存使用。
- 使用代码静态分析工具优化代码。
- 启用NSZombieEnabled可发现更多内存问题。
参考资料:
iOS应用开发性能调优(from Apple)
iOS开发经验总结—内存管理相关推荐
- iOS/OS X内存管理(一):基本概念与原理
iOS/OS X内存管理(一):基本概念与原理 发表于21小时前| 1585次阅读| 来源CSDN| 8 条评论| 作者刘耀柱 移动开发iOSObjective-C内存管理内存泄露局部变量开发经验 a ...
- iOS/OS X内存管理(二):借助工具解决内存问题
上一篇博客<iOS/OS X内存管理(一):基本概念与原理>主要讲了iOS/OS X内存管理中引用计数和内存管理规则,以及引入ARC新的内存管理机制之后如何选择ownership qual ...
- iOS开发ARC内存管理技术要点
本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...
- iOS开发ARC内存管理
本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃 ...
- iOS夯实:内存管理
最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual reta ...
- iOS OC08,09_内存管理
//管理内存有三种方式,//1.是垃圾回收,java常见的管理内存的方法,系统来检測对象是否被使用,是否被释放//2.MRC手动管理引用计数,iOS管理内存的方式,程序猿通过手动的方式来管理对象是否被 ...
- (0048)iOS开发之内存管理探究
注意网上很多人支招在ARC模式下可以利用_objc_rootRetainCount()或者CFGetRetainCount()取得 retainCount都是不准确的,特别是在对象拷贝操作之后你会发现 ...
- iOS的block内存管理
初始情况下: block本身.__block修饰的变量以及在block内部使用的变量都是在栈里的. __block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂).blo ...
- iphone内存管理
http://hi.baidu.com/spopavenvldiqyr/item/c8d620b6282c4d4abb0e122a iphone内存管理(一) BY 洋葱头 http://hi.bai ...
最新文章
- ECLIPSE 调试F8-------运行到下一断点处 F5-------STEP INTO F6-------STEP OVER
- fanuc机器人cm格式文件_了解发那科智能机器人自动化物流拆垛
- Qt Creator分析函数执行
- 新闻视频 36:整合首页 用到 Repeater 主要用gridview /gridview去掉边框用到 BorderWidth=”0” inner join和 left...
- 进入DRF和ANGULAR的整合学习,这三篇入门内容一定要学好的
- ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
- Windows 8 C++/CX字符串
- 【演讲实录】下一代企业级应用架构管理体系
- 维基链能成为下一个以太坊吗?
- 强烈推荐几个BAT大佬技术公众号~值得学习!
- excel2016打开后空白不显示内容的解决办法
- NokiaE6 java_全键盘塞班Anna手机 诺基亚E6详细评测
- 程序员,如何做好工作复盘?
- Linux部署单体架构,从单体式架构迁移到微服务架构:三个策略叙述
- Charset API
- MMA8451Q传感器读值
- 军队文职(数学2+物理)——高等数学 3、求极限(一)
- 「衡水中学语录分享」喜欢点波关注呗
- 打开虚拟机报错,解决:Entering emergency mode. Exit the shell to continu
- 数学分析(2):自然数集的构建
热门文章
- 【快速入门Linux】8_Linux命令—系统信息相关命令(时间、磁盘、进程)
- office2019安装Mathtype7.4运行时错误‘53’,文件未找到:MathPage.WLL
- python分布爬虫_13天搞定Python分布爬虫(第七天)(Scrapy)
- 树莓派linux系统识别u盘启动,使用U-Boot让树莓派从U盘启动
- 常用的数据结构_动态图展示 6 个常用的数据结构,一目了然
- 宏观经济学思维导图_2019中央财经大学803经济学经验分享|三跨考生
- python之路day2_Python之路,day2
- ubuntu 安装 guetzli
- mv命令移动文件到指定目录
- 关于phi函数的积性性质的一个证明