开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” 。iPhone OS 对内存的要求很严格,有memory leak ,杀掉;内存使用超限额,杀掉。一个经过测试的程序,在使用过程中90%以上的崩溃都是内存问题造成的。在这里简单总结一下Object-C 内存管理。
基本概念
Object-C 的内存管理基于引用计数(Reference Count)这种非常常用的技术。简单讲,如果要使用一个对象,并希望确保在使用期间对象不被释放,需要通过函数调用来取得“所有权”,使用结束后再调用函数释放“所有权”。“所有权”的获得和释放,对应引用计数的增加和减少,为正数时代表对象还有引用,为零时代表可以释放。
函数
获得所有权的函数包括
* alloc - 创建对象是调用alloc,为对象分配内存,对象引用计数加一。
* copy - 拷贝一个对象,返回新对象,引用计数加一。
* retain - 引用计数加一,获得对象的所有权。
另外,名字中带有alloc, copy, retain 字串的函数也都认为会为引用计数加一。
释放所有权的函数包括
* release - 引用计数减一,释放所有权。如果引用计数减到零,对象会被释放。
* autorelease - 在未来某个时机释放。下面具体解释。
autorelease
在某些情况下,并不想取得所有权,又不希望对象被释放。例如在一个函数中生成了一个新对象并返回,函数本身并不希望取得所有权,因为取得后再没有机会释放(除非创造出新的调用规则,而调用规则是一切混乱的开始),又不可能在函数内释放,可以借助autorelease 。所谓autorelease , 可以理解为把所有权交给一个外在的系统(这个系统实际上叫autorelease pool),由它来管理该对象的释放。通常认为交给 autorelease 的对象在当前event loop 中都是有效的。也可以自己创建NSAutoreleasePool 来控制autorelease的过程。
据苹果的人说,autorelease效率不高,所以能自己release的地方,尽量自己release,不要随便交给autorelease来处理。
规则
引用计数系统有自己的引用规则,遵守规则就可以少出错:
* 获得所有权的函数要和释放所有权的函数一一对应。
* 保证只有带alloc, copy, retain 字串的函数才会让调用者获得所有权,也就是引用计数加一。
* 在对象的 dealloc函数中释放对象所拥有的实例变量。
* 永远不要直接调用dealloc来释放对象,完全依赖引用计数来完成对象的释放。
有很多类都提供“便利构造函数(convenience constructors)”,它们创建对象但并不增加引用计数,意味着不需要调用release来释放所有权。很好辨认,它们的名字中不会有alloc和copy。
只要遵守这些规则,基本上可以消除所有Intrument可以发现的内存泄露问题。
容器
类似NSArray, NSDictionary, NSSet 等类,会在对象加入后引用计数加一获得所有权,在对象被移除或者整个容器对象被释放的时候释放容器内对象的所有权。类似的情况还有UIView对 subview的所有权关系,UINavigationController对其栈上的controller的所有权关系等等。
其他所有权的产生
还有一些用法会让系统拥有对象的所有权。比如NSObject 的performSelector:withObject:afterDelay 。如果有必要,需要显示的调用cancelPreviousPerformRequestsWithTarget:selector:object: ,否则有可能产生内存泄露。
因这种原因产生的泄露因为并不违反任何规则,是Intrument所无法发现的。
循环引用
所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
* 对象a创建并引用了对象b.
* 对象b创建并引用了对象c.
* 对象c创建并引用了对象b.
这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a,如果这个 delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。
因为循环引用而产生的内存泄露也是Instrument无法发现的,所以要特别小心。
一些和内存管理相关的有用内容:
Practical Memory Management
Reference counting
最后说明下,在ios5里面,apple最新的编译器,帮你处理的复杂的内存管理。
分享到:
相关推荐
### iPhone开发官方指南:内存管理编程指南精要 #### 引言 在软件工程领域,尤其是在移动应用开发中,如iPhone应用开发,内存管理是一项核心技能。它关乎应用的性能、稳定性和用户体验。《iPhone开发官方指南:...
ios iphone开发-内存管理 所有权是iPhone内存管理的核心思想,对象的所有者负责在使用完对象后进行释放。一个对象可以有多个所有者,当它没有所有者时将被设置为取消分配(deallocation)
### iPhone开发教程之iPhone内存释放注意事项两则 #### 内存管理基础知识 在iOS开发过程中,内存管理是一项非常重要的任务。对于iOS应用来说,如果内存管理不当,可能会导致程序崩溃或者被系统强制关闭。在...
本文将深入探讨iPhone开发中Objective-C的内存管理技术,涵盖基本概念、核心原则以及实战技巧。 #### 一、Objective-C与内存管理 Objective-C作为苹果开发环境的主要语言之一,其内存管理机制区别于自动管理的.NET...
Swift语法简洁明了,支持类型推断和安全的内存管理,使得编写代码更加高效。文档可能也会介绍Swift与Objective-C的互操作性,让你能够充分利用两者的优势。 iOS应用的生命周期管理和状态保存也是关键内容。开发者...
这里整理的“iPhone开发资料个人整理”包含了一系列文档,旨在帮助开发者深入理解并熟练掌握iPhone应用的开发流程和技术要点。 1. **《iPhone开发必备.pdf》**: 这份文档可能包含了iPhone应用开发的基础知识,...
《3G手机开发资料(iPhone开发)》是一份详尽的教育资源,专为那些希望深入理解和掌握3G技术以及iPhone应用程序开发的人群设计。这份资料集合了3G通信技术和Apple的iPhone SDK,提供了全面的学习路径,帮助开发者们...
iPhone应用开发中的Object-C内存管理是开发者必须掌握的关键技能,特别是在资源有限的移动设备上,如iPhone OS(现称为iOS)。内存管理不当可能导致程序崩溃,严重影响用户体验。Object-C的内存管理基于引用计数机制...
在探讨iPhone内存管理的核心知识点时,我们主要关注的是Objective-C编程环境下如何有效地管理和优化iOS设备上的内存使用。尽管部分信息因版权原因无法详尽展示,但我们可以基于标题、描述、标签以及部分内容,深入...
同时,对性能和内存管理的要求也很高,开发者必须确保应用程序能够高效运行,不会消耗过多的内存或电池。 iPhone应用开发指南还强调了开发过程中所需的各类文档和资料,包括API参考、编程指南以及各种开发工具和...
本资源包“cocos2d iPhone 中文开发资料大全”集合了关于Cocos2d-iPhone开发的众多资料,对于想要学习和精通这个框架的开发者来说,是一份宝贵的资源。 在Cocos2d-iPhone中,主要包含以下几个核心知识点: 1. **...
除此之外,你还会接触到iOS的生命周期管理,包括应用的启动过程、状态管理和内存管理。了解如何妥善处理后台任务和节能模式,确保应用在不同场景下都能正常运行。 在导航和数据存储方面,教程会讲解UITableView和...
标题中的“最权威的iPhone开发资料”表明了这个压缩包包含的是关于iPhone应用程序开发的专业文献。这些资源可能来自知名出版商或业界专家,为开发者提供深入的指导和知识。 描述中提到“含中文和英文资料”,这暗示...
学习iPhone开发是一个系统而全面的过程,它涉及到编程基础、开发工具、框架掌握等多个方面。文章以《如何学好iPhone开发》为主题,详细阐述了学习iPhone游戏开发所需的基础知识、推荐的学习资源、开发工具的运用、...
### 基础iPhone开发资料知识点汇总 #### SDK(Software Developer Kit)介绍 SDK 是苹果提供的用于开发 iPhone 应用程序的一系列工具集合。通过这些工具,开发者可以编写、调试和发布自己的应用到 App Store 或者...
这包括测试策略、内存管理、性能分析工具的使用,以及App Store的提交流程和规定。 总之,《深入浅出iPhone开发》是一本全面覆盖iPhone应用开发的教程,它不仅教授技术,更注重实践,让读者通过实例学习,从而真正...
本文将深入探讨标题为"很好的iPhone开发英文资料"的资源包中可能涵盖的关键知识点,帮助您理解和掌握iPhone应用开发的核心技能。 首先,我们要明确,iPhone应用开发主要依赖于Apple提供的开发工具Xcode。Xcode是...
这份文档将列出Unity3D在iPhone上的一些限制,如性能瓶颈、内存管理、图形渲染等方面的挑战,帮助开发者在设计和优化时避免踩坑。 10. **Unite08_iPhone.pdf**:Unite是Unity Technologies组织的年度开发者大会,...
在iOS平台上,开发一款应用程序,比如“iPhone开发应用之计算器”,通常涉及到多个技术层面和步骤。这个特定的应用,名为"CuteCal",已经成功上线并可在App Store中找到,这表明开发者已经完成了从设计到发布的整个...