我所理解的Block:1坯临、Block簡析

1、Block 本質(zhì)上是一個struct結(jié)構(gòu)體恋昼,在這個結(jié)構(gòu)體中看靠,最重要的成員是一個函數(shù)(當(dāng)然除函數(shù)外還有其他重要的成員)。

2液肌、在開始解析Block之前挟炬,首先來回顧一下Block的格式。Block相關(guān)的格式有2個:
(1)、Block對象的格式谤祖;
(2)婿滓、Block變量的格式;

3粥喜、對于Block對象凸主,它有幾種常見的格式:
(1)、一個完整的Block對象的格式如下:



比如這個Block對象:



可以發(fā)現(xiàn)额湘,完整的Block對象和函數(shù)的定義非常相似卿吐,比如這個函數(shù):

兩者之間的區(qū)別僅僅是:Block對象多了一個“^”符號,并且不需要像函數(shù)一樣指定函數(shù)名锋华;

(2)嗡官、在完整的格式中有一些項目是可以省略的,比如“返回值類型”毯焕。不管Block對象是否有返回值衍腥,這個項目都是可以省略的,省略之后纳猫,只要表達(dá)式中有return語句就會自動使用該返回值的類型婆咸,如果沒有return語句就會使用void類型。
在這種情況下芜辕,Block對象的格式就變成了:



所以上文(1)中的Block對象可以寫成這樣:

(3)擅耽、除此之外,如果Block對象不需要參數(shù)的話物遇,那么“參數(shù)列表”這個項目也是可以省略的乖仇,這時候Block對象的格式就變成了:

比如這樣的一個Block對象:

4、定義了Block對象之后询兴,還要定義Block變量來持有它乃沙,才能更方便地使用Block對象∈ⅲ回顧一下3(1)的函數(shù):



對于這種函數(shù)警儒,可以聲明這樣一個函數(shù)指針類型變量來使用它:



這時使用*funcPtr的就相當(dāng)于在使用func函數(shù)了。
同樣的眶根,對于3(1)中的Block對象蜀铲,也可以聲明這么一個Block變量:

這時使用block()的時候就相當(dāng)于在使用這個Block對象了。
對比函數(shù)指針和Block變量的聲明属百,可以發(fā)現(xiàn)兩者也是非常相似的记劝,區(qū)別僅僅是將*號換成^號。

5族扰、如果要將Block變量當(dāng)做參數(shù)來傳遞的話厌丑,每次使用都完整地定義它顯然是很麻煩的事定欧。比如想要在一個函數(shù)里使用Block變量類型的參數(shù),完整的定義方式應(yīng)該是這樣的:



這顯然是很繁瑣的怒竿,這時候就可以通過typedef來簡化變量:



那么這個函數(shù)就可以定義成:

這時就可以非常方便地使用Block變量了砍鸠。

6、回顧完Block 相關(guān)的格式耕驰,接下來開始來討論Block的實現(xiàn)爷辱。
在前文提到過,Block最重要的組成部分是一個函數(shù)朦肘,這也就意味著托嚣,大部分Block能實現(xiàn)的功能,其實使用函數(shù)也可以實現(xiàn)的厚骗。接下來就先來試一試要如何在不使用Block的情況下實現(xiàn)Block的功能。
思考這么一個問題:假設(shè)有兩個按鈕button1和button2兢哭,要求實現(xiàn)以下功能:
(1)领舰、按鈕有編號;
(2)迟螺、編號可修改冲秽;
(3)、點擊按鈕輸出自己的編號矩父。

7锉桑、首先簡單的方法可以通過使用兩個函數(shù)來實現(xiàn):



兩個函數(shù)分別對應(yīng)兩個按鈕的點擊,調(diào)用函數(shù)時把按鈕的編號作為參數(shù)傳進(jìn)去窍株,便能打印出對應(yīng)編號民轴。
看起來似乎能滿足功能了,但是這種方法的問題也是很明顯的:按鈕并不持有自己的編號球订,需要調(diào)用函數(shù)的時候才將編號傳進(jìn)去后裸。
這種方法顯然還不夠完善。

8冒滩、根據(jù)面向?qū)ο蟮乃伎挤绞轿⑹唬ㄟ^將按鈕抽象成類并把編號定義成按鈕類的實例變量是可以實現(xiàn)這個功能的。但是這里只想要使用普通C語言來實現(xiàn)开睡,那么可以這么處理因苹,把每個按鈕的編號定義成全局變量來進(jìn)行保存,修改的代碼如下:



這樣按鈕就“持有”了編號篇恒,實現(xiàn)了問題的3個要求扶檐。

9、回過頭來看一看問題胁艰,如果要使用Block來實現(xiàn)這3個要求的話蘸秘,代碼會是這樣的:



這段代碼所實現(xiàn)的功能官卡,和8的代碼所實現(xiàn)的功能其實就是一樣的了。

10醋虏、事實上寻咒,這兩段代碼幾乎就是等價的了,8的代碼幾乎就是9的代碼轉(zhuǎn)換成普通C語言后的樣子(注意“幾乎”這個字眼颈嚼,實際上5的代碼轉(zhuǎn)換成普通C語言后與4的代碼還是有不少差別的)毛秘。
而對于問題中所提的3個要求,其實就是Block的3個主要功能點:
(1)阻课、能截獲變量叫挟;
(2)、能截獲可變的變量限煞;
(3)抹恳、回調(diào)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末署驻,一起剝皮案震驚了整個濱河市奋献,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旺上,老刑警劉巖瓶蚂,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宣吱,居然都是意外死亡窃这,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門征候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杭攻,“玉大人,你說我怎么就攤上這事疤坝∑由希” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵卒煞,是天一觀的道長痪宰。 經(jīng)常有香客問我,道長畔裕,這世上最難降的妖魔是什么衣撬? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮扮饶,結(jié)果婚禮上具练,老公的妹妹穿的比我還像新娘。我一直安慰自己甜无,他們只是感情好扛点,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布哥遮。 她就那樣靜靜地躺著,像睡著了一般陵究。 火紅的嫁衣襯著肌膚如雪眠饮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天铜邮,我揣著相機(jī)與錄音仪召,去河邊找鬼。 笑死松蒜,一個胖子當(dāng)著我的面吹牛扔茅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秸苗,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼召娜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惊楼?” 一聲冷哼從身側(cè)響起玖瘸,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胁后,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦枢,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡攀芯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了文虏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣诺。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氧秘,靈堂內(nèi)的尸體忽然破棺而出年鸳,到底是詐尸還是另有隱情,我是刑警寧澤丸相,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布搔确,位于F島的核電站,受9級特大地震影響灭忠,放射性物質(zhì)發(fā)生泄漏膳算。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一弛作、第九天 我趴在偏房一處隱蔽的房頂上張望涕蜂。 院中可真熱鬧,春花似錦映琳、人聲如沸机隙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有鹿。三九已至旭旭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間印颤,已是汗流浹背您机。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留年局,地道東北人际看。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像矢否,于是被迫代替她去往敵國和親仲闽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案僵朗? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評論 1 92
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法赖欣,類相關(guān)的語法,內(nèi)部類的語法验庙,繼承相關(guān)的語法顶吮,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 原來以為廣場舞是東北的專利湃交,一群大爺大媽吃完晚飯出去集結(jié)在一起,伴著悠揚(yáng)的音樂舞動搖擺藤巢。 后來去了北京搞莺,在某個小區(qū)...
    愛麗是松兒閱讀 653評論 0 0
  • 心理特點:可能以前曾經(jīng)為上班族、因為生孩子或?qū)ぷ鞑粷M而在家做家庭主婦掂咒。但是孩子大了以后才沧,自己在家漸漸空虛,同時擔(dān)...
    李大女兒閱讀 316評論 0 0
  • 神秘湘西自古多鬼話绍刮,在趕尸之外的鬼故事蠻是相當(dāng)嚇人糜工。 在湘西有一伙人特別受釣魚,經(jīng)常背了釣具录淡,帶上帳篷和睡袋捌木、吃食...
    卷耳的秋天閱讀 569評論 5 2