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