2010-11-10 40 views
73

通常情況下,如果你生成一個後臺線程或運行在一個NSOperationQueue的的NSOperation你需要爲線程或操作創建一個NSAutoreleasePool因爲沒有缺省存在。您是否需要在GCD塊中創建一個NSAutoreleasePool?

做同樣的規則適用於放置在大中央調度隊列中,將在非主線程運行塊?也就是說,是否需要在每個塊中創建一個NSAutoreleasePool,然後將其分派給主隊列以外的任何其他塊?

在我有限的測試中,我沒有看到控制檯警告,自動釋放的對象,你通常與後臺線程或NSOperations看到。但是,我似乎無法找到關於此的明確文檔,所以我想知道是否有人可以指出這說明的地方。

+0

從張貼@Gustavo Ambrozio的答案,被取出,[文檔是在這裏(http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues。 html#// apple_ref/doc/uid/TP40008091-CH102-SW17),以防觀看者感興趣。 – iDev 2013-02-26 06:23:15

回答

107

做同樣的規則適用於放置在大中央 調度隊列中,將運行在一個 非主線程塊 ?也就是說,你需要 內 創建NSAutoreleasePool每次派遣到任何東西 以外的主隊列塊?

Grand central dispatch會自動管理每個隊列的自動釋放池。但是,關於池何時被排乾的問題沒有保證;它可能在一個塊被處理後,可能會在數百(但可能不會)之後。

所以,如果你只分配了幾個對象,不用擔心。但是,如果你分配了大量的對象(並且因爲你的目標是內存受限的環境),那麼你應該創建和抽取池。


該文檔已更新。

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

如果你的塊創建比一些Objective-C的對象越多,你可能 要附上你的塊的部分代碼在@autorelease塊 處理那些內存管理對象。儘管GCD調度 隊列擁有自己的自動釋放池,但當這些池被耗盡時,他們不保證 。如果您的應用程序受限於內存 ,則創建您自己的自動釋放池允許您以更常規的時間間隔爲自動釋放對象釋放內存。

+3

+1這是在任何地方的文檔? – 2010-11-10 06:43:34

+6

不夠清楚。提交文檔錯誤()。 – bbum 2010-11-10 07:27:42

+3

優秀。感謝您的澄清。 – 2010-11-10 13:46:16

相關問題