上一章節提到了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{
......
}
}