《Objective-C高級(jí)編程》Blocks 閱讀筆記系列
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item1(Blocks概要和模式)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item2(Block的實(shí)質(zhì))
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item3(截獲自動(dòng)變量值)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item4(__block說(shuō)明符)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item5(Block存儲(chǔ)域)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item6(__block變量存儲(chǔ)域)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item7(截獲對(duì)象)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item8(__block變量和對(duì)象)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item9(Block循環(huán)引用)
《Objective-C高級(jí)編程》Blocks 閱讀筆記 item10(copy/release實(shí)例方法)
前言
接著看Objective-C高級(jí)編程第2章 Blocks的知識(shí)點(diǎn)油够,第3節(jié)有關(guān)Blocks的實(shí)現(xiàn)實(shí)在是難啃雹有,只能慢慢啃了倒槐。
2.1 Blcoks概要
2.1.1 什么是Blocks
- Blocks是C語(yǔ)言的擴(kuò)充功能——“帶有自動(dòng)變量(即局部變量)的匿名函數(shù)”泌霍。
- 使用Blocks可以不聲明C++和Objective-C類鹅心,也沒(méi)有使用靜態(tài)變量、靜態(tài)全局變量或全局變量時(shí)的問(wèn)題阻荒,僅用編程C語(yǔ)言函數(shù)的源代碼量即可使用帶有自動(dòng)變量值的匿名函數(shù)金吗。
2.2 Blocks模式
2.2.1 Block語(yǔ)法(即Block常量表達(dá)式)
與一般的C語(yǔ)言函數(shù)定義相比,完整形式的Block語(yǔ)法有兩點(diǎn)不同:
- 沒(méi)有函數(shù)名稱
- 帶有“^”
*** Block語(yǔ)法 ***
*** 省略返回值類型的Block語(yǔ)法 ***
*** 省略返回值類型和參數(shù)列表的Block語(yǔ)法 ***
2.2.2 Block類型變量(即Block變量)
在Block語(yǔ)法下餐济,可將Block語(yǔ)法賦值給聲明為Block類型的變量中(即源代碼中一旦使用Block語(yǔ)法就相當(dāng)于生成了可賦值給Block類型變量的“值”)耘擂。“Block”即指源代碼中的Block語(yǔ)法絮姆,也指由Block語(yǔ)法所生成的值醉冤。
- 使用Block語(yǔ)法將Block賦值為Block類型變量。
- 由Block類型變量向Block類型變量賦值篙悯。
- 在函數(shù)參數(shù)中使用Block類型變量可以向函數(shù)傳遞Block蚁阳。
- 在函數(shù)返回值中指定Block類型,可以將Block作為函數(shù)的返回值返回鸽照。
- 在函數(shù)參數(shù)和返回值中使用Block類型變量時(shí)螺捐,可以通過(guò)typedef為Block類型提供別名,從而起到簡(jiǎn)化塊類型變量名的作用矮燎。
- 通過(guò)Block類型變量調(diào)用Block與C語(yǔ)言通常的函數(shù)調(diào)用沒(méi)有區(qū)別(例如定血,在函數(shù)和方法中可以將Block類型變量作為參數(shù))砚哆。
- Block類型變量可完全像通常的C語(yǔ)言變量一樣使用(例如欢际,可以使用指向Block類型變量的指針,即Block的指針類型變量)晋控。
2.2.3 截獲自動(dòng)變量值
Blocks中浅乔,Block常量表達(dá)式會(huì)截獲所使用的自動(dòng)變量的值(即保存該自動(dòng)變量的瞬間值)倔喂,從而在執(zhí)行塊時(shí)使用。
2.2.4 __block說(shuō)明符(即存儲(chǔ)類型修改符)
使用附有__block說(shuō)明符的自動(dòng)變量可在Block中賦值靖苇,該變量稱為_(kāi)_block變量席噩。
2.2.5 截獲的自動(dòng)變量
- 如果將值賦值給Block中截獲的自動(dòng)變量,就會(huì)產(chǎn)生編譯錯(cuò)誤贤壁。這種情況下悼枢,需要給截獲的自動(dòng)變量附加__block說(shuō)明符。
- 截獲Objective-C對(duì)象脾拆,調(diào)用變更該對(duì)象的方法并不會(huì)產(chǎn)生編譯錯(cuò)誤馒索,但是,向截獲的自動(dòng)變量(即所截獲的Objective-C對(duì)象)賦值則會(huì)產(chǎn)生錯(cuò)誤名船〈律希總之,賦值給截獲的自動(dòng)變量會(huì)產(chǎn)生編譯錯(cuò)誤渠驼,但使用截獲的值卻不會(huì)有任何問(wèn)題蜈块。
- 在現(xiàn)在的Block中,截獲自動(dòng)變量的方法并沒(méi)有實(shí)現(xiàn)對(duì)C語(yǔ)言數(shù)組的截獲,但是百揭,使用指針可以解決該問(wèn)題爽哎。
*** 通過(guò)指針實(shí)現(xiàn)對(duì)C語(yǔ)言數(shù)組自動(dòng)變量的截獲 ***
const char *text = "hello";
void (^blk)(void) = ^{
printf("%c\n", text[2]);
};
blk();