iOS 開發(fā)之Block

ios4.0之后,block橫空出世,它本身封裝了一段代碼并將這段代碼當做變量,通過block()的方式進行回調(diào).類似于C函數(shù)中,定義一個指向函數(shù)的指針并調(diào)用:

bool executeSomeTask(void) {
    // do something and return if success or not
}
bool (*taskPoint)(void);
taskPoint = something;

上面的函數(shù)指針可以直接通過(*taskPoint)()方式調(diào)用executeSomeTask這個函數(shù), 這樣對比block似乎跟C語言的函數(shù)指針是一樣的, 但是兩者仍然存在差別:

1. block的代碼是內(nèi)聯(lián)的, 效率高于函數(shù)調(diào)用;
2. block對于外部變量默認是只讀屬性,要變成可讀可寫,就需要加上__block,或者將棧中的block復制到堆上一份,從而避免了循環(huán)引用這個情況;
3. block被Objective-C看成是對象處理

下面,我們一起來認識一下神秘的Block:
首先了解洗block的三種存儲形態(tài):
_NSConcretStackBlock(棧),_NSConcretGlobalBlock(全局),_NSConcretMallocBlock(堆)

要點一: 當block在函數(shù)內(nèi)部, 且定義的時候就使用了函數(shù)內(nèi)部的變量, 那么這個block是存儲在棧上的.
要點二: 1.當block定義在函數(shù)體外面, 2.定義在函數(shù)體內(nèi)部,但當時函數(shù)執(zhí)行的時候,block體中并沒有需要使用函數(shù)內(nèi)部的局部變量, 也就是block在函數(shù)執(zhí)行的時候只是靜靜地待在一邊定義了一下而不使用函數(shù)體的內(nèi)容, 那么block將會被編譯器存儲為全局block.
要點三: 全局block儲存在堆中, 對全局block使用copy操作會返回原函數(shù)指針;而對棧中的block使用copy操作,會產(chǎn)生兩個不同的block地址, 也就是了兩個匿名函數(shù)的入口地址.
要點四: ARC機制優(yōu)化會將stack的block, 轉(zhuǎn)為heap的block進行調(diào)用.

Block的基本定義:

int (^myBlock)(int a, int b) = ^(int a, int b){ return a*b};
第一個int 為返回值類型,如果沒有返回值則用void
myBlock 為block 的名字
第二個int 為參數(shù)類型
等號前面為block的聲明,等號后面為block的實現(xiàn)
int a, int b 為block傳入的形參
大括號內(nèi)部為block體
block是代碼塊,所以需要用;符號
如果暫時等號左邊的值不需要的話,block是不執(zhí)行的

按照這種聲明方式未免麻煩了些,別擔心,蘋果早已為我們準備好了一切

typedef void(^DownloadBlock)(NSData *success);
就是這么簡單,然后可以自救寫一個屬性方便調(diào)用,或者嵌在函數(shù)里,或者直接調(diào)用

總結(jié):block捕獲變量,代碼傳遞,代碼內(nèi)聯(lián)等特性賦予了它多于代理機制的功能和靈活性,盡管它也存在循環(huán)引用,不易調(diào)試追溯等缺陷,但是無疑它深受開發(fā)者的喜愛.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末练对,一起剝皮案震驚了整個濱河市眠蚂,隨后出現(xiàn)的幾起案子鹿响,更是在濱河造成了極大的恐慌充甚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡包竹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門籍凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來周瞎,“玉大人,你說我怎么就攤上這事饵蒂∩睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵退盯,是天一觀的道長彼乌。 經(jīng)常有香客問我,道長渊迁,這世上最難降的妖魔是什么慰照? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮宫纬,結(jié)果婚禮上焚挠,老公的妹妹穿的比我還像新娘。我一直安慰自己漓骚,他們只是感情好蝌衔,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝌蹂,像睡著了一般噩斟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孤个,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天剃允,我揣著相機與錄音,去河邊找鬼齐鲤。 笑死斥废,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的给郊。 我是一名探鬼主播牡肉,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淆九!你這毒婦竟也來了统锤?” 一聲冷哼從身側(cè)響起毛俏,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饲窿,沒想到半個月后煌寇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡逾雄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年阀溶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘲驾。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡淌哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辽故,到底是詐尸還是另有隱情,我是刑警寧澤腐碱,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布荷憋,位于F島的核電站跪妥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜践美,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望息裸。 院中可真熱鬧列吼,春花似錦、人聲如沸遵蚜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吭净。三九已至睡汹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寂殉,已是汗流浹背囚巴。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留友扰,地道東北人彤叉。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像村怪,于是被迫代替她去往敵國和親秽浇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)实愚、block兼呵、GCD兔辅,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,816評論 10 69
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,146評論 30 470
  • 1.block是ios中的一種比較特殊的數(shù)據(jù)類型,可參考C語言的函數(shù)指針 是用來保存一段代碼击喂,可以在恰當?shù)臅r間在取...
    Cat_uncle閱讀 375評論 0 0
  • Block基礎(chǔ)回顧 1.什么是Block维苔? 帶有局部變量的匿名函數(shù)(名字不重要,知道怎么用就行)懂昂,差不多就與C語言...
    Bugfix閱讀 6,766評論 5 61
  • 前言 Blocks是C語言的擴充功能介时,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,768評論 0 23