2012-04-21 22 views
-2

可能重複:
What is the difference between releasing and autoreleasing?發佈和自動發佈之間有什麼區別,有沒有什麼辦法可以創建用戶定義的自動釋放池?

嗨能否請您詳細說明是哪一個版本,並自動釋放之間的差異,有沒有什麼辦法來創建一個用戶定義的自動釋放池和真實的嗎?使用自動釋放池。

+0

這些問題中的任何一個都不完全相同,這包括如何創建自己的池的主題。 – 2012-04-21 06:22:57

回答

0

release立即釋放對象,而autorelease將來會有一段時間。

例:你會想返回autoreleaseð這裏反對,因爲如果你願意release它,它已經將之前的代碼獲得的dealloc調用此方法可以利用返回的對象!

- (NSObject *)someMethod 
{ 
    return [[[NSObject alloc] init] autorelease]; 
} 
+0

你能告訴我什麼時候這個對象autorelease發生了嗎?因爲我沒有調用任何發佈版本,蘋果如何確定目標的範圍已經結束? – 2012-04-21 06:12:25

+0

@harikrishnan:autorelease(將其添加到池中)立即發生。當池本身被釋放/排空時,池釋放對象。當你自己做到這一點(對你創建的池)或者當你返回到應用程序的事件循環時,會發生這種情況。 – 2012-04-21 06:21:51

4

發佈會立即減少對象的引用計數,這意味着如果它的保留計數達到零,它將立即解除分配。自動釋放是一種延遲釋放 - 對所有權切換有用。請參考+[NSString stringWithFormat:]。它會創建一個新的NSString實例(使用alloc &某種形式的init),然後將其傳遞給調用者。那個類方法不希望在那之後仍然「擁有」創建的字符串,但是如果它在返回之前釋放新的字符串,新的字符串將在調用者獲取之前被釋放。相反,它會自動釋放新的字符串:這意味着該字符串將保持足夠長的時間以便呼叫者抓住它並在需要時保留它。

如果調用者不保留它會發生什麼?這就是autorelease池發揮作用的地方。 NSAutoreleasPool跟蹤每個autorelease,當被告知耗盡時,它釋放其池中的所有對象(如果它們的引用計數爲零,則導致它們被釋放)。默認情況下,在Mac或iOS應用程序中,主事件循環中有一個自動釋放池 - 因此,如果您撥打stringWithFormat:並且不保留結果,它將在下一次傳遞中消失。

您可以使用NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]創建您自己的自動釋放池,並使用[pool drain]進行排空。如果您在創建大量臨時對象的地方有一段代碼,這會很有用。

+0

在現代代碼中,應該使用'@ autoreleasepool'語句而不是創建NSAutoreleasePool對象。你不能搞錯一個'@ autoreleasepool'而不會釋放它,它會在代碼說明它會結束時結束。此外,現代代碼應該真的使用ARC而不是保留/釋放(這是缺省原因);使用ARC,'retain','release'和'autorelease'方法以及NSAutoreleasePool類都會消失,編譯器會爲您做正確的事情。 – 2012-04-21 06:25:27

相關問題