2012-09-25 59 views
1

我已經實現了一些NSOperation的自定義子類以在隊列中使用。自定義NSOperations自動釋放池

哪裏(或可能)我設置了@autoreleasepool

在我的自定義操作的main方法中?

或者在我將操作添加到隊列實例的語句中?

編輯:

如果我正在添加塊的操作? @autoreleasepool是否也應該進入該區塊?

我正在使用ARC,如果這是相關的。

回答

0

使用autorelease池的主要原因是爲了防止臨時不需要的對象的巨大聚合。例如,假設你的操作打開了一堆圖​​像,從中提取出一些圖像(保存在NSData對象中),然後作爲最後一步將新圖像轉換爲圖像。

在這種情況下,我會做的是把開放和提取片放在自動釋放池(確保NSData對象被正確保留),然後在創建和保存新圖像之前退出。這樣,所有打開的圖像都可以得到釋放。

我沒有理由在操作中通常使用自動釋放池,因爲一旦操作完成後,隊列就像當時或之後不久一樣。

事實上,在ARC中,編譯器有時會將對象從autorelease池中取出,然後保留,然後在不需要時直接釋放它們。

除非你有一個已知的迫切需要一個池,我不會使用一個。現在,如果你用一個'start'方法使用一個併發的NSOperation,那麼這是一個不同的故事,你應該用一個池來包裝runloop的代碼。