一、autorelease基本用法
1.给某个对象
发送一条autorelease消息时,就会将这个对象加到一个自动释放池中
2.
当自动释放池销毁时,会给池子里面的所有对象发送一条release消息
3
.
调用autorelease方法时并不会改变对象的计数器,并且会返回对象本身
4.
autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release
二、自动释放池的创建
ios 5.0后
@autoreleasepool
{
// ....
}
ios 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc]init];
// .....
[pool release]; // 或[pool drain];
在程序运行过程中,可以创建多个自动释放池,它们是以栈的形式存在内存中
OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
三、应用实例跟release的对比
以前:
Book *book = [[Book alloc] init];
[book release];
现在:
Book *book = [[[Book alloc] init] autorelease];
// 不要再调用[book release];
一般可以为类添加一个快速创建对象的类方法
+ (id)book {
return [[[Book alloc] init] autorelease];
}
外界调用[ Book book]时,根本不用考虑在什么时候释放返回的Book对象。
四、规律
1. 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
2. 比如下面的对象都已经是autorelease的,不需要再release
NSNumber *n = [NSNumber numberWithInt:100];
NSString *s = [NSString stringWithFormat:@"jack"];
NSString *s2 = @"rose";
3. 占用内存较大的对象,不要随便使用autorelease。最好用release精确控制。占用内存较小的对象,使用autorelease没有太大影响