Objective-C提供了三种内存管理方式:manual retain-release(MRR,手动管理),automatic reference counting(ARC,自动引用计数),garbage collection(垃圾回收)。iOS不支持垃圾回收;ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;这篇笔记主要讲的是手动管理。
(一)内存管理的目的是:
1.不要释放或者覆盖还在使用的内存,这会引起程序崩溃;
2.释放不再使用的内存,防止内存泄露。iOS程序的内存资源是宝贵的。
MRR手动管理内存也是基于引用计数的,只是需要开发者发消息给某块内存(或者说是对象)来改变这块内存的引用计数以实现内存管理(ARC技术则是编译器代替开发者完成相应的工作)。一块内存如果计数是零,也就是没有使用者(owner),那么objective-C的运行环境会自动回收这块内存。
(二)内存管理遵守下面这个简单的策略:
注:文档中把引用计数加1的操作称为“拥有”(own,或者take ownership of)某块对象/内存;把引用计数减1的操作称为放弃(relinquish)这块对象/内存。拥有对象时,你可以放心地读写或者返回对象;当对象被所有人放弃时,objective-C的运行环境会回收这个对象。
1.你拥有你创建的对象
也就是说创建的对象(使用alloc,new,copy或者mutalbeCopy等方法)的初始引用计数是1。
2.给对象发送retain消息后,你拥有了这个对象
3.当你不需要使用该对象时,发送release或者autorelease消息放弃这个对象
4.不要对你不拥有的对象发送“放弃”的消息
(三)dealloc方法
dealloc方法用来释放这个对象所占的内存(包括成员变量)和其它资源。
不要使用dealloc方法来管理稀缺资源,比如文件,网络链接等。因为由于bug或者程序意外退出,dealloc方法不能保证一定会被调用。
(四)Autorelease Pool
为了方便程序员管理内存,苹果在OC中引入了自动释放池(Autorelease
Pool)。在遵守一些规则的情况下,可以自动释放对象。
Autorelease Pool 的原理:
autorelease pool 全名叫做NSAutoreleasePool,是OC中的一个类。autorelease pool并不是天生就有的,你需要手动的去创建它
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
一般地,在新建一个iphone 项目的时候,xcode会自动地为你创建一个autorelease pool,这个pool就写在Main函数里面。
在NSAutoreleasePool中包含了一个 可变数组,用来存储被声明为autorelease的对象。当NSAutoreleasePool自身被销毁的时候,它会遍历这个数组,release数组中的每一个成员(注意,这里只是release,并没有直接销毁对象)。
若成员的retain count 大于1,那么对象没有被销毁,造成内存泄露。