在iOS/CocoaTouch上,我經常看到代碼在方法中創建一個新的NSAutoreleasePool實例。我最近在國家統計局內看到一個。NSAutoreleasePool。什麼時候適合創建一個新的自動釋放池?
設置NSAutoreleasePool的新實例的基本規則是什麼?爲什麼這比單純依靠在main.m中創建的預先存在的發佈池更可取?
感謝,
道格
在iOS/CocoaTouch上,我經常看到代碼在方法中創建一個新的NSAutoreleasePool實例。我最近在國家統計局內看到一個。NSAutoreleasePool。什麼時候適合創建一個新的自動釋放池?
設置NSAutoreleasePool的新實例的基本規則是什麼?爲什麼這比單純依靠在main.m中創建的預先存在的發佈池更可取?
感謝,
道格
您可以使用一個新的自動釋放池,只要你想要的,但它並不總是有益的。無論何時你開始一個新的線程或在該線程中autoreleased的對象都會被泄漏。在創建和自動釋放大量對象的方法中創建新的自動釋放池也很常見。例如,如果您有一個循環在50次迭代中每次創建了10個對象,則應該考慮爲該方法創建一個自動釋放池(如果不是循環的一部分),以便爲每次迭代創建一個新對象。
創建自己的池時,如果還沒有一個(如在一個新的線程中),或者當運行循環中的一個不足時(在循環中創建自動釋放對象,將運行多個迭代),或者當你想要增加控制你創建的自動釋放對象何時最終被釋放。
我在iOS 4.3中測試過,當執行performSelectorInBackground時需要創建自己的自動釋放池。使用NSOperation或dispatch_async時不需要創建。
似乎在iOS> = 5.0中,即使使用performSelectorInBackground,系統也會自動創建自動釋放池,所以當您需要創建自己的自動釋放池時,我無法找到一個案例。
雖然無法找到記錄的變化。
何時本地autorelease池不利。我收集創建一個動機是爲了細粒度的管理。此外,您聲明必須爲新線程創建新的自動釋放池。這對NSOperations來說是否屬實?我是一個狂熱的測試者,並且沒有發現mems漏洞與我目前缺乏本地autorelease池的NSOperations。 – dugla 2011-03-07 14:58:22
@dugla我不確定你是否需要爲NSOperations創建一個。當一個對象沒有池時自動釋放,它會向控制檯輸出一條消息,所以你應該知道你是否需要一個。如果在生命週期內不創建大量對象,創建一個池是不利的,因爲它會增加額外的分配並佔用處理器週期。除非在其生命週期中使用objective-c對象,否則它不會有任何好處,因爲其他對象不使用它。 – ughoavgfhw 2011-03-08 03:22:07