第一種獲取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ù)釋放。