上一章节提到了autorelease,千万不要把这东西与ARC混淆了,它更像C语言中自动变量(局部变量)所具有的特性。当超出其作用域时,对象实例将会自动调用release。与C语言不同的是,编程人员需要自己设定变量的作用域。
autorelease的具体使用方法如下:
- 生成并持有NSAutoreleasePool对象
- 调用已分配对象的autorelease实例方法
- 废弃NSAutoreleasePool对象
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj = [[NSObject alloc] init];
[obj autorelease];
//在这里,obj会被添加到pool中,由pool统一进行一次release
[pool drain];
}
NSAutoreleasePool对象的生存周期相当于C语言变量的作用域。对于所有调用过autorelease实例方法的对象,在废弃NSAutoreleasePool对象时,都将调用release实例方法。
Cocoa框架中,主循环或者其他程序可运行的地方,已有对NSAutoreleasePool对象进行生成、持有和废弃。因此,开发者不一定会使用到NSAutoreleasePool对象进行开发。尽管如此,但如果大量产生autorelease对象,不对NSAutoreleasePool进行废弃的话,这些对象也不会释放,这就会造成内存不足的情况。所以,有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。
此外,建议用@autorelease代替NSAutoreleasePool,与其原理基本相同:
{
@autorelease{
......
}
}