天天看點

Objective-C記憶體管理之autorelease(二)

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

繼續閱讀