Effective Objective-C 2.0讀書筆記(六)

塊與大中樞派發(fā)

“塊”(block)是一種可在C帆赢、C++及Objective-C代碼中使用的“詞法閉包”(lexical closure)碟狞,它極為有用,開發(fā)者可將代碼像對象一樣傳遞,令其在不同環(huán)境(context)下運行。在定義“塊”的范圍內(nèi)助析,它可以訪問到其中的全部變量。
“大中樞派發(fā)”(Grand Central Dispatch椅您,GCD)是一種與塊有關(guān)的技術(shù),它提供了對線程的抽象寡键,而這種抽象則基于“派發(fā)隊列”(dispatch queue)掀泳。開發(fā)者可將塊排入隊列中雪隧,由GCD負(fù)責(zé)處理所有調(diào)度事宜。

37.理解“塊”這一概念

塊是C员舵、C++脑沿、Objective-C中的詞法閉包。

塊可接受參數(shù)马僻,也可返回值庄拇。

塊可以分配在棧或堆上韭邓,也可以是全局的措近。分配在棧上的塊可拷貝到堆里,這樣的話女淑,就和標(biāo)準(zhǔn)的Objective-C對象一樣瞭郑,具備引用計數(shù)了。

38.為常用的塊類型創(chuàng)建typedef

以typedef重新定義塊類型,可令塊變量用起來更加簡單。

定義新類型時應(yīng)遵從現(xiàn)有的命名習(xí)慣荷科,勿使其名稱與別的類型相沖突手负。

不妨為同一個塊簽名定義多個類型別名。如果要重構(gòu)的代碼使用了塊類型的某個別名粉臊,那么只需修改相應(yīng)typedef中的塊簽名即可,無需改動其他typedef。

39.用handler塊降低代碼分散程度

在創(chuàng)建對象時场绿,可以使用內(nèi)聯(lián)的handler塊將相關(guān)業(yè)務(wù)邏輯一并聲明。

在有多個實例需要監(jiān)控時俺夕,如果采用委托模式裳凸,那么經(jīng)常需要根據(jù)傳入的對象來切換,而若改用handler塊來實現(xiàn)劝贸,則可直接將塊與相關(guān)對象放在一起姨谷。

設(shè)計API時如果用到了handler塊,那么可以增加一個參數(shù)映九,使調(diào)用者可通過此參數(shù)來決定應(yīng)該把塊安排在哪個隊列上執(zhí)行梦湘。

40.用塊引用其所屬對象時不要出現(xiàn)保留環(huán)

如果塊所捕獲的對象直接或間接地保留了塊本身,那么就得當(dāng)心保留環(huán)問題件甥。

一定要找個適當(dāng)?shù)臅r機解除保留環(huán)捌议,而不能把責(zé)任推給API的調(diào)用者。

41.多用派發(fā)隊列引有,少用同步鎖

派發(fā)隊列可用來表述同步語義(synchronization semantic)瓣颅,這種做法要比使用@synchronized塊或NSLock對象更簡單。

將同步與異步派發(fā)結(jié)合起來譬正」梗可以實現(xiàn)與普通加鎖機制一樣的同步行為檬姥,而這么做卻不會阻塞執(zhí)行異步派發(fā)的線程。

使用同步隊列及柵欄塊粉怕,可以令同步行為更加高效健民。

42.多用GCD,少用performSelector系列方法

performSelector系列方法在內(nèi)存管理方面容易有疏失贫贝。它無法確定將要執(zhí)行的選擇子具體是什么秉犹,因而ARC編譯器也就無法插入適當(dāng)?shù)膬?nèi)存管理方法。

performSelector系列方法所能處理得選擇子太過局限了稚晚,選擇子的返回值類型及發(fā)送給方法的參數(shù)個數(shù)都受到限制崇堵。

如果想把任務(wù)放在另一個線程上執(zhí)行,那么最好不要用performSelector系列方法蜈彼,而是應(yīng)該把任務(wù)封裝到塊里筑辨,然后調(diào)用大中樞派發(fā)機制的相關(guān)方法來實現(xiàn)。

43.掌握GCD及操作隊列的使用時機

使用NSOperation及NSOperationQueue的好處:

  • 取消某個操作
  • 指定操作間的依賴關(guān)系幸逆。
  • 通過鍵值觀測機制(KVO)來監(jiān)聽棍辕。
  • 指定操作的優(yōu)先級。
  • 重用NSOperation對象还绘。

44.通過Dispatch Group機制楚昭,根據(jù)系統(tǒng)資源狀況來執(zhí)行任務(wù)

一系列任務(wù)可歸入一個dispatch group之中,開發(fā)者可以在這組任務(wù)執(zhí)行完畢時獲得通知拍顷。

通過dispatch group抚太,可以在并發(fā)隊列里同時執(zhí)行多項任務(wù)。

45.使用dispatch_once來執(zhí)行只需運行一次的線程安全代碼

經(jīng)常需要編寫“只需執(zhí)行一次的線程安全代碼”(thread-safe single-code execution)昔案。通過GCD所提供的dispatch_once函數(shù)尿贫,很容易就能實現(xiàn)此功能。

標(biāo)記應(yīng)該聲明在static過global作用域中踏揣,這樣的話庆亡,在把只需執(zhí)行一次的塊傳給dispatch_once函數(shù)時,傳進(jìn)去的標(biāo)記也是相同的捞稿。

46.不要使用dispatch_get_current_queue

dispatch_get_current_queue函數(shù)的行為常常與開發(fā)者所預(yù)期的不同又谋。此函數(shù)已經(jīng)廢棄,只應(yīng)做調(diào)試之用娱局。

由于派發(fā)隊列是按層級來組織的彰亥,所以無法單用某個隊列隊象來描述“當(dāng)前隊列”這一概念。

dispatch_get_current_queue函數(shù)用于解決由不可重入的代碼所引發(fā)的死鎖衰齐,然而能用此函數(shù)解決的問題任斋,通常也能改用“隊列特定數(shù)據(jù)”來解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻涛,一起剝皮案震驚了整個濱河市仁卷,隨后出現(xiàn)的幾起案子穴翩,更是在濱河造成了極大的恐慌,老刑警劉巖锦积,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歉嗓,居然都是意外死亡丰介,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門鉴分,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哮幢,“玉大人,你說我怎么就攤上這事志珍〕裙福” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵伦糯,是天一觀的道長柜某。 經(jīng)常有香客問我,道長敛纲,這世上最難降的妖魔是什么喂击? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮淤翔,結(jié)果婚禮上翰绊,老公的妹妹穿的比我還像新娘。我一直安慰自己旁壮,他們只是感情好监嗜,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抡谐,像睡著了一般裁奇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上童叠,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天框喳,我揣著相機與錄音,去河邊找鬼厦坛。 笑死五垮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杜秸。 我是一名探鬼主播放仗,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撬碟!你這毒婦竟也來了诞挨?” 一聲冷哼從身側(cè)響起莉撇,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惶傻,沒想到半個月后棍郎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡银室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年涂佃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈敢。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡辜荠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抓狭,到底是詐尸還是另有隱情伯病,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布否过,位于F島的核電站午笛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叠纹。R本人自食惡果不足惜季研,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誉察。 院中可真熱鬧与涡,春花似錦、人聲如沸持偏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸿秆。三九已至酌畜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卿叽,已是汗流浹背桥胞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留考婴,地道東北人贩虾。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像沥阱,于是被迫代替她去往敵國和親缎罢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344