天天看點

OC自動釋放池autoreleasepool介紹

自動釋放池的機制是:它使得應用在建立新對象時,系統能夠有效地管理應用所使用的記憶體。

@autoreleasepool
{
    statements
}
           

在建立新對象時,并且系統未啟動ARC特性,那麼在使用完該對象後需要釋放對象空間。

此時有兩種選擇,一種是給對象發送release消息,此時該對象空間就會馬上被釋放掉;

另一種是給對象發送autorelease消息,此時系統不會馬上釋放該對象,而是在離它最近的自動釋放池結束的位置會被釋放掉,因為自動釋放池在執行到末尾時,會給池中對象發送release消息,将引用計數減為0,然後發送dealloc消息,并将它們的記憶體釋放掉。

 下面是自動釋放池的例子。

int main(int argc, char * argv[])
{
    @autoreleasepool
    {
        
        Fraction *frac1 = [[Fraction alloc] init];
        Fraction *frac2 = [[Fraction alloc] init];
        
        [frac1 setNumberator: 2];
        [frac1 setDenominator: 3];
        
        [frac2 setNumberator: 3];
        [frac2 setDenominator: 7];
        
        NSLog(@"First fraction is:");
        [frac1 print];
        
        NSLog(@"Second fraction is:");
        [frac2 print];
        
        [frac1 release];
        [frac2 release];
    }
    return 0;
}
           

當你使用完一個對象,需要自己手動釋放這些對象。

程式中,在main開始時建立自動釋放池,在應用傳回之前,main結束的位置清理自動釋放池。

-(Fraction *) add: (Fraction *) f
{
    //對兩個分數求和
    // a/b + c/d = ((a*b) + (b*c)) / (b*d)
    //存儲相加後的結果
    
    Fraction *result = [[Fraction alloc] init];
    
    result.numberator = numberator * f.denominator + denominator * f.numberator;

    [result reduce];
    return result;
}
           

如果使用手工記憶體管理,這個方法會出現一個問題,建立的對象會在計算執行後被方法作為結果傳回。因為方法傳回這個對象,是以并不能釋放它。

解決這個問題的最好方法是自動釋放這個對象,這樣它的值就能夠作為結果傳回,能夠延遲對象的釋放直到自動釋放池被清理。

可以寫成下面的樣子。

-(Fraction *) add: (Fraction *) f
{
    //對兩個分數求和
    // a/b + c/d = ((a*b) + (b*c)) / (b*d)
    //存儲相加後的結果
    
   // Fraction *result = [[Fraction alloc] init];
    Fraction *result = [[[Fraction alloc] init] autorelease];
    
    result.numberator = numberator * f.denominator + denominator * f.numberator;

    [result reduce];
    return result;
}
           

或者是

-(Fraction *) add: (Fraction *) f
{
    //對兩個分數求和
    // a/b + c/d = ((a*b) + (b*c)) / (b*d)
    //存儲相加後的結果
    
    Fraction *result = [[Fraction alloc] init];
    
    result.numberator = numberator * f.denominator + denominator * f.numberator;

    [result reduce];
    //return result;
    return [result autorelease];
}
           

轉載于:https://www.cnblogs.com/PaulpauL/p/5752145.html

繼續閱讀