第三章 3.2.2 dispatch_queue_create

第一種獲取Dispatch Queue的方法是通過GCD的API"dispatch_queue_create"生成Dispatch Queue。

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("生成隊(duì)列的名稱", NULL);

第一個(gè)參數(shù):
指定生成返回的Dispatch Queue的名稱
命名規(guī)則:簡(jiǎn)單易懂
該名稱在Xcode和Instruments的調(diào)試器中作為Dispatch Queue的名稱表示
該名稱也會(huì)出現(xiàn)在程序崩潰時(shí)所生成的CrashLog中

第二個(gè)參數(shù):
指定為NULL或DISPATCH_QUEUE_SERIAL,生成Serial Dispatch Queue。
指定為DISPATCH_QUEUE_CONCURRENT,生成Concurrent Dispatch Queue。

返回值:
表示Dispatch Queue的dispatch_queue_t類型

問題一、dispatch_queue_create生成Serial Dispatch Queue的注意事項(xiàng)?
生成多個(gè)Serial Dispatch Queue時(shí),各個(gè)Serial Dispatch Queue將并行執(zhí)行,雖然一個(gè)Serial Dispatch Queue只能執(zhí)行一個(gè)處理,但如果將多個(gè)處理分別追加到同樣數(shù)量的多個(gè)Serial Dispatch Queue中,每個(gè)Serial Dispatch Queue執(zhí)行一個(gè)處理,這多個(gè)處理其實(shí)是并行執(zhí)行,此時(shí)效果將和使用Concurrent Dispatch Queue一樣。

問題二、多個(gè)Serial Dispatch Queue引發(fā)的問題?
一個(gè)Serial Dispatch Queue只能生成一個(gè)線程,過多的使用Serial Dispatch Queue會(huì)消耗大量?jī)?nèi)存,降低系統(tǒng)響應(yīng)性能。

問題三、Serial Dispatch Queue的用途?
避免多線程編程的問題之一———多個(gè)線程更新相同資源導(dǎo)致的數(shù)據(jù)競(jìng)爭(zhēng)問題,可以使用Serial Dispatch Queue解決。

不用考慮數(shù)據(jù)競(jìng)爭(zhēng),可以并行執(zhí)行時(shí),可以使用Concurrent Dispatch Queue,Concurrent Dispatch Queue由XNU管理線程,不會(huì)發(fā)生Serial Dispatch Queue引發(fā)的問題。

問題四、Dispatch Queue的內(nèi)存管理?
因?yàn)镈ispatch Queue沒有像Block那樣具有作為OC對(duì)象處理的技術(shù),所以生成的Dispatch Queue必須由程序員負(fù)責(zé)釋放。

dispatch_release(mySerialDispatchQueue);

使用dispatch_release()函數(shù)釋放生成的Dispatch Queue

相應(yīng)地也存在dispatch_retain()函數(shù)

dispatch_retain(mySerialDispatchQueue);

例子:
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.exemple.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(myConcurrentDispatchQueue, ^{
        NSLog(@"block on myConcurrentDispatchQueue");
});
    
dispatch_release(myConcurrentDispatchQueue);

問題五、上面的例子代碼,立即釋放myConcurrentDispatchQueue是否有問題?
完全沒有問題。
例子代碼中,myConcurrentDispatchQueue持有對(duì)dispatch_queue_create()函數(shù)生成對(duì)象,而在dispatch_async函數(shù)中追加Block到生成的Dispatch Queue中,所以Block通過dispatch_retain函數(shù)也持有生成的Dispatch Queue,雖然dispatch_release立即釋放myConcurrentDispatchQueue對(duì)生成Dispatch Queue的持有,但Block還持有,只有Block執(zhí)行結(jié)束后才會(huì)釋放Dispatch Queue,Dispatch Queue才會(huì)被廢棄。
(上面所說的Block通過dispatch_retain函數(shù)持有Dispatch Queue,應(yīng)該涉及到底層實(shí)現(xiàn))

總結(jié):
在通過函數(shù)或其他方法獲取Dispatch Queue以及其他名稱中含有create的API生成的對(duì)象時(shí),有必要通過dispatch_retain函數(shù)持有,在不需要時(shí)通過dispatch_release函數(shù)釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容