2012-06-25 24 views
2

可能重複:
Objective-C: With ARC, what's better? alloc or autorelease initializers?使用ARC時,[[NSArray alloc] init]和「autorelased」[NSArray array]之間是否有區別?

不ARC自動打開類初始化的自動釋放版本到適當的非autorelased版本,或者他們仍然在技術上被自動釋放?

我不想在任何時間內保持內存超過它的絕對需要,所以我習慣了在幾乎所有情況下都使用alloc/init的習慣。現在在ARC中,我想知道我是否可以開始使用「autorelease」初始化程序,並期望它們像非自動迴歸版本一樣行爲...

有沒有人有我可以找到的地方的任何文檔ARC下自動發佈的方法會發生什麼?

+0

這個問題的答案 - 基本相同 - 表明autorelease版本實際上更快:http://stackoverflow.com/questions/6776537/objective-c-with-arc-whats-better-alloc-or- autorelease-initializers –

回答

2

當你得到一個自動釋放對象時,只要你的代碼和被調用的方法/函數都是用ARC編譯的,ARC將設法避免自動釋放池,

ARC在您的代碼中添加對objc_retainAutoreleasedReturnValue的調用,並在調用的函數/方法中調用objc_autoreleaseReturnValue。在運行時,當objc_autoreleaseReturnValue看到返回值將被objc_retainAutoreleaseReturnValue保留時,它不會自動釋放該對象並設置一個標誌來告知objc_retainAutoreleaseReturnValue不保留該對象。因此,使用便捷的創建方法而不是(可感知的)額外成本而不是alloc/init

有關該機制的更多信息,請參閱Matt Galloway的How does objc_retainAutoreleasedReturnValue work?

總之,只要使用你喜歡的方法,Apple工程師就會確保它運行得很快。

+0

謝謝,這完全解釋了它! –

0

從技術上講,它們並不相同,因爲ARC在編譯時只是在代碼中插入「保留」和「釋放」到代碼中(必要時)。

0

如果您在啓動對象時使用指針,ARC會存儲對象的強引用,否則會立即釋放該對象。所以我相信你關於NSArray的問題的答案是不,ARC不會將它變成一個自動釋放對象。它還增加了一個發佈聲明,每當在相當的範圍不再需要的對象的代碼:

-(void) aMethod 
{ 
    [NSArray alloc]; 
} 

//in essence is transformed into 

-(void) aMethod 
{ 
    NSArray *temp = [NSArray alloc]; 
    [temp release]; 
} 

如果您已經存儲的指針,ARC將盡快爲對象正要離開的範圍添加釋放。

相關問題