WEB开发网
开发学院手机开发iPhone 开发 iPhone开发内存管理 阅读

iPhone开发内存管理

 2010-10-21 01:38:50 来源:WEB开发网   
核心提示:开发iPhone 应用程序并不难,基本上就是三个词 - “memory, memory, memory” ,iPhone开发内存管理,iPhone OS 对内存的要求很严格,有memory leak ,保证只有带alloc, copy, retain 字串的函数才会让调用者获得所有权,也就是引用计数加一,杀掉; 内存使

开发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函数中释放对象所拥有的实例变量。

1 2 3  下一页

Tags:iPhone 开发 内存

编辑录入:coldstar [复制链接] [打 印]
赞助商链接