Objective-C 高級編程 iOS與OS X多線程和內存管理 之學習筆記-第2章 Blocks

第2章 Blocks

? ? 2.1 什么事Blocks:是C語言的擴充功能揪漩。帶有自動變量(局部變量)的匿名函數(shù)狞尔。

? ? ? ?C語言中函數(shù)可能使用的變量:

????????????自動變量(局部變量)

????????????函數(shù)的參數(shù)

????????????靜態(tài)變量(靜態(tài)局部變量)

????????????靜態(tài)全局變量

????????????全局變量??? ?

? ? ? ?后三個在函數(shù)多次調用之間能夠傳遞值?? ?

?? ?? ? 在計算機科學中修己,此概念也稱為閉包(Closure)父阻、lambda計算浓冒。

?? ?? ? C + Blocks ? ? ? ? ? Block

?? ?? ? Smalltalk?? ??? ?? ? ? Block

?? ?? ? Ruby?? ??? ??? ??? ?? ? Block

?? ?? ? Python?? ??? ??? ??? ??Lambda

?? ?? ? C++??? ??? ??? ??? ??? ??Lambda

?? ?? ? JS?? ??? ??? ??? ??? ??? ? Anonymous function

? ? 2.2 Blocks 模式

?? ?? ? 2.2.1 語法:1笔刹、沒有函數(shù)名 2、帶有^

?? ??? ?? ? ^void ( int event ) {

?? ??? ??? ??? ?? ? printf();

? ? ? ? ? ?}

?? ??? ?? ? ^ 返回值類型 參數(shù)列表 表達式 :無返回值溪窒,返回值類型省略坤塞。無參數(shù)時,參數(shù)列表省略澈蚌。

?? ?? ? 2.2.2 Block 類型變量

?? ??? ?? ? C語言中 int (*funcptr)(int) = &func; 函數(shù)func的地址就賦值給函數(shù)指針類型變量funcptr中了

?? ??? ?? ? Block既指源代碼中的Block語法摹芙,也指有Block語法生成的值。

?? ??? ?? ? 聲明Block類型的變量 ?int (^blk)(int); ?與一般的C語言變量完全相同宛瞄。

?? ??? ?? ? typedef int(^blk_t)(int) 聲明blk_t類型的變量浮禾。

?? ??? ?? ? Block類型變量指針,即Block的指針類型變量

?? ??? ?? ? blk_t blk = ^(int count){return count + 1; };

?? ??? ?? ? blk_t *blkptr = &blk;

?? ??? ?? ? (*blkptr)(10);

?? ?? ? 2.2.3 截獲自動變量值 ?Block使用的是它之前聲明的自動變量份汗。

?? ?? ? 使用附有__block 說明符的自動變量可在Block中賦值盈电,該變量稱為__block變量

?? ?? ? 截獲的自動變量可以被使用陕壹,但不可給截獲的自動變量賦值绸硕。若想賦值使用__block修飾

? ? 2.3 Blocks 的實現(xiàn)

?? ?? ? 帶有自動變量值的匿名函數(shù)友绝。實際上是作為極普通的C語言源代碼來處理的沧卢。

?? ?? ? 所謂Block就是Objective-C對象

?? ?? ? 所謂“截獲自動變量”意味著在執(zhí)行Block語法時铸鹰,Block語法表達式所使用的自動變量值被保存到Block的結構體實例中具温。

?? ?? ? 不能改寫被截獲的自動變量的值岭佳。

?? ?? ? 在Block中保存值:

????????????????靜態(tài)變量怪瓶、靜態(tài)全局變量均践、全局變量

????????????????使用__block說明符(修飾的自動變量生成結構體實例晤锹,有一個__forwarding結構體指針指向自身)


? ? ? a. ?NSConcreteStackBlock Block對象設置在棧上 ?copy ?從棧復制到堆

?? ??? ??? ?? ? 設置在棧上的Block,其所屬的變量作用域結束,該Block被廢棄彤委。__block變量也一樣鞭铆。

? ? ? ?b. NSConcreteGlobalBlock Block對象設置在程序的數(shù)據(jù)區(qū)域(.data區(qū))上? ? 什么也不做

?? ??? ??? ?? ? 使用全局變量的地方不能使用自動變量,所以不存在自動變量截獲焦影。

?? ??? ??? ?? ? Block結構體實例的內容不依賴于執(zhí)行時的狀態(tài)车遂,所以整個程序只需一個實例

?? ??? ??? ?? ? 只要Block不截獲自動變量,就可以將Block用結構體實例設置在程序的數(shù)據(jù)區(qū)域

? ? ? ?c. NSConcreteMallocBlock Block對象設置在內存塊(即堆)上? ? 引用計數(shù)增加

?? ??? ??? ?? ? __block變量會跟隨Block從棧復制到堆時一起被賦值斯辰,此時Block持有__block變量舶担。

?? ??? ??? ?? ? 別的Block從棧復制到堆時,被復制的Block持有的__block變量彬呻,并增加__block變量的引用計數(shù)

?? ??? ??? ?? ? 堆上的Block被廢棄衣陶,它所使用的__block也被釋放柄瑰。(沒有持有者被廢棄)

?? ??? ??? ??? ?__block復制到堆之后,棧上的__block變量的__forwarding結構體指針指向復制到堆上的__block變量用結構體的指針


?? ?? ? 將BLock作為函數(shù)返回值返回時剪况,編譯器會自動生成復制到堆上的代碼

?? ?? ? 不需要手動復制:

?? ??? ?? ? Cocoa框架下的方法且方法名中含有usingBlock

?? ??? ?? ? GCD的API


?? ?? ? 截獲對象:

?? ?? ? _Block_object_assgin()相當于retain實例方法教沾,將對象賦值在對象類型的結構體成員變量中 ? ? 棧上的Block復制到堆時

?? ??? ?_Block_object_dispose()相當于release實例方法,釋放賦值在對象類型的結構體成員變量中的對象?? ?? ?堆上的Block被廢棄時

?? ?? ? 什么時候棧上的Block會復制到堆上译断?

????????????調用Block的copy實例方法

? ? ? ? ? ? ?Block作為函數(shù)的返回值返回

????????????將Block賦值給附有__strong修飾符id類型的類或Block類型成員變量時

????????????方法名中含有usingBlock的Cocoa框架方法或GCD的API(Grand Central Dispatch)

?? ?? ? Block循環(huán)引用:

?? ??? ?? ? 對象持有Block授翻,Block持有對象self?? ?? ? 使用weak修飾符,避免造成循環(huán)引用

?? ??? ?? ? A->B->A? ? 也可以使用__block變量來避免循環(huán)引用(必須執(zhí)行Block)

?? ??? ?? ? A->B->C->A

?? ?? ? ARC無效時孙咪,一般需要手動將Block從棧復制到堆堪唐。用copy來復制,用release來釋放翎蹈。retain來持有淮菠。

? ? ? ? 此時用__Block說明符來避免Block中的循環(huán)引用

PS:加深記憶

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荤堪,隨后出現(xiàn)的幾起案子兜材,更是在濱河造成了極大的恐慌,老刑警劉巖逞力,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糠爬,居然都是意外死亡寇荧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門执隧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揩抡,“玉大人,你說我怎么就攤上這事镀琉÷袜停” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵屋摔,是天一觀的道長烁设。 經(jīng)常有香客問我,道長钓试,這世上最難降的妖魔是什么装黑? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮弓熏,結果婚禮上恋谭,老公的妹妹穿的比我還像新娘。我一直安慰自己挽鞠,他們只是感情好疚颊,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布狈孔。 她就那樣靜靜地躺著,像睡著了一般材义。 火紅的嫁衣襯著肌膚如雪均抽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天母截,我揣著相機與錄音到忽,去河邊找鬼。 笑死清寇,一個胖子當著我的面吹牛喘漏,可吹牛的內容都是我干的。 我是一名探鬼主播华烟,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼翩迈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盔夜?” 一聲冷哼從身側響起负饲,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喂链,沒想到半個月后返十,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡椭微,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年洞坑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝇率。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡迟杂,死狀恐怖,靈堂內的尸體忽然破棺而出本慕,到底是詐尸還是另有隱情排拷,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布锅尘,位于F島的核電站监氢,受9級特大地震影響,放射性物質發(fā)生泄漏鉴象。R本人自食惡果不足惜忙菠,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺弊。 院中可真熱鬧牛欢,春花似錦、人聲如沸淆游。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拾稳,卻和暖如春吮炕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背访得。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工龙亲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悍抑。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓鳄炉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搜骡。 傳聞我的和親對象是個殘疾皇子拂盯,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容