編寫高質量代碼的52個方法

NO

第六章 塊與大中樞派發(fā)(GCD)

37. 塊的基本概念
  • 塊的強大之處:在聲明它的范圍里所有變量都可以為其所捕獲. 默認情況下,為塊所捕獲的變量,是不可以在塊里修改的.若聲明變量的時候加上__block修飾符,就可以在塊內修改了.
  • 塊可以分配在椘暄或堆上,?也可以是全局的.分配在棧上的塊可以copy到堆上,一旦拷貝到堆上,塊就成了帶引用計數的對象了.后續(xù)的復制都不會真的執(zhí)行復制,只是遞增塊對象的引用計數
  • 全局塊:不會捕捉任何狀態(tài),運行時也無須有狀態(tài)來參與.塊所使用的整個內存在編譯期就已經完全確定了.屬于一種優(yōu)化操作
  void (^block)() = ^{
   NSLog(@"全局塊");
};
  • 如果將塊定義在實例方法中,那么除了可以訪問類的所有實例變量外,還可以使用self變量.塊總能修改實例變量,所以在聲明時無需添加__block.不過如果通過讀取或寫入操作捕獲了實例變量,那么也會自動將self變量一并捕獲,因為實例變量是與self所指代的實例關聯在一起的.
  • self也是個對象,因而塊在捕獲它時,也會將其保留,如果self所指代的對象同時也保留了塊,那么會導致保留環(huán).
塊的內部結構
  • 塊的內存布局:塊本身也是個對象,在存放的內存區(qū)域中,首個變量是指向Class對象的指針.其余內存里含有塊對象正常運轉所需的各種信息


    塊的內部結構.png
  • 在內存布局中,最重要的就是invoke變量,這是個函數指針,指向塊的實現代碼.函數原型至少要接受一個void* 型的參數,此參數代表塊. 塊其實就是一種代替函數指針的語法結構,原來使用函數指針時,需要用"不透明的void指針"來傳遞狀態(tài),而改用塊后則可以把原來用C語言所編寫的代碼封裝成簡明易用的接口.
  • descriptor變量是指向結構體的指針,每個塊里都包含此結構體,其中聲明了塊對象的總體大小,還聲明了copy和dispose兩個輔助函數所對應的函數指針.輔助函數在拷貝及丟棄塊對象是運行,比如copy要保留捕獲的對象,dispose則將之釋放.
  • 塊還會把它所捕獲的所有變量都拷貝一份.這些拷貝放在descriptor變量后面,捕獲多少個變量,就要占據多少內存空間.請注意拷貝的不是對象本身,而是指向這些對象的指針變量.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子攒砖,更是在濱河造成了極大的恐慌痰洒,老刑警劉巖叁温,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤剧,死亡現場離奇詭異,居然都是意外死亡缎除,警方通過查閱死者的電腦和手機严就,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器罐,“玉大人梢为,你說我怎么就攤上這事『浞唬” “怎么了铸董?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肴沫。 經常有香客問我粟害,道長,這世上最難降的妖魔是什么颤芬? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任悲幅,我火速辦了婚禮,結果婚禮上站蝠,老公的妹妹穿的比我還像新娘汰具。我一直安慰自己,他們只是感情好菱魔,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布留荔。 她就那樣靜靜地躺著,像睡著了一般澜倦。 火紅的嫁衣襯著肌膚如雪聚蝶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天肥隆,我揣著相機與錄音既荚,去河邊找鬼。 笑死栋艳,一個胖子當著我的面吹牛,可吹牛的內容都是我干的句各。 我是一名探鬼主播吸占,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凿宾!你這毒婦竟也來了矾屯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤初厚,失蹤者是張志新(化名)和其女友劉穎件蚕,沒想到半個月后孙技,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡排作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年牵啦,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妄痪。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡哈雏,死狀恐怖,靈堂內的尸體忽然破棺而出衫生,到底是詐尸還是另有隱情裳瘪,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布罪针,位于F島的核電站彭羹,受9級特大地震影響,放射性物質發(fā)生泄漏泪酱。R本人自食惡果不足惜派殷,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望西篓。 院中可真熱鬧愈腾,春花似錦、人聲如沸岂津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吮成。三九已至橱乱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱甫,已是汗流浹背泳叠。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茶宵,地道東北人危纫。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像乌庶,于是被迫代替她去往敵國和親种蝶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容