4

我想知道如果下面的代碼是一個很好的方式來使用新的@autoreleasepool,我應該這樣使用它還是讓主autoreleasepool照顧對象?使用@autoreleasepools的正確方法?

  • (void)callingAutoReleasedObject,可能是我的viewDidAppear或類似的函數。

謝謝!

- (UIBarButtonItem*)backButton { 
    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"CustomBackTitle" 
                    style:UIBarButtonItemStyleBordered 
                    target:nil 
                    action:nil]; 
    return [backButton autorelease]; 
} 

- (void) callingAutoReleasedObject { 

    @autoreleasepool { 
     [[self navigationItem] setBackBarButtonItem:[self backButton]]; 
    } 
} 

回答

8

從蘋果公司的reference

有,但是,三種情況時可能會使用自己的 自動釋放池:如果你正在編寫一個不是基於一個程序

  • UI框架,例如 作爲命令行工具。

  • 如果您編寫一個循環來創建許多 臨時對象。您可以在循環 內創建一個自動釋放池,在下一次迭代之前處置這些對象。在循環中使用 自動釋放池有助於減少應用程序的最大內存佔用量。

  • 如果你生成一個輔助線程。一旦線程開始執行,您必須創建自己的autorelease 池;否則,你的應用程序將會泄漏對象。 (有關詳細信息,請參閱「自動釋放池和線程」 。)

我個人爲了避免重內存泄漏,期間使用核心數據後臺同步,由於框架(我愛)創建自動釋放物體的數量龐大,必須創建了幾個@autoreleasepool塊被排空以保留可用內存;)

0

你應該需要定義自己的自動釋放池的唯一原因是如果你還創建自己的線程。

對於你在做什麼以上,絕對只使用主自動釋放池。

+1

當你有一個會創建一堆臨時對象的循環時,使用自動釋放池非常有用。 在這種情況下,你會希望儘快釋放它們。 否則很明顯,你應該避免它們。 – 2012-01-31 09:52:58

1

您一般會創建一個自動釋放池時:

  • 程序啓動
  • 你開始一個新的線程
  • 您從C或C++接口接收回調,而你不知道當呼叫者爲你設置一個池時
  • 當你創建大量的自動釋放對象真的,這應該比許多人使用它們更普遍。它們非常輕巧。
  • 當自動釋放對象的數據/ ivars是大型的,可以提前釋放一個池到位。例如,保存像素數據或音頻數據的objc對象。
  • 調試ref計數偏移時。

對於像你的例子一樣簡單,不要打擾。

2

創建autoreleasepool的另一個原因是如果您在創建大量自動釋放對象的循環中。