2011-03-23 55 views
8

當我創建我的gcd隊列的視圖控制器調用我的模型類方法時,我得到內存泄漏。有任何想法嗎?使用盛大的中央派遣內部類方法導致內存泄漏

+(void)myClassMethod { 
    dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); //run with leak instrument points here as culprit 
    dispatch_async(myQueue, ^{}); 
} 

回答

18

您應將其更改爲...

dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); 
dispatch_async(myQueue, ^{}); 
dispatch_release(myQueue); 

...你應該叫dispatch_release當你不再需要將隊列的訪問。而且由於myQueue是局部變量,因此您需要

閱讀dispatch_queue_create文檔:

討論

塊提交到隊列中在FIFO順序一次執行一個。但是,請注意,提交給獨立隊列的塊可能會相對於彼此同時執行。

當您的應用程序不再需要調度隊列時,它應該使用dispatch_release函數釋放它。提交給隊列的任何未決塊保存對該隊列的引用,所以直到所有待處理塊都完成後,隊列纔會被釋放。

+0

這是否仍然如此?使用ARC我們不需要釋放它 – hfossli 2016-08-31 12:28:37

4

泄漏工具報告內存分配的位置不再有任何代碼引用。

在該方法運行後,由於沒有任何對您創建的隊列的引用,並且dispatch_release()從未被調用過,所以它被認爲是泄漏。

+1

即使ARC也不會爲你處理。所以你也必須發佈它:dispatch_release(myQueue).. – geforce 2012-05-09 11:31:18