精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS中block介紹(三)揭開神秘面紗(上)

移動開發(fā) iOS
上一篇我們總結了各個情況下,block及其引用到的內存位置情況。接下來幾篇,我們將剖析編譯器轉碼以及運行時庫源碼來一探block的究竟。

block到底是什么

我們使用clang的rewrite-objc命令來獲取轉碼后的代碼。

1、block的底層實現(xiàn)

我們來看看最簡單的一個block:

 

這個block僅僅打印棧變量i和j的值,其被clang轉碼為:

首先是一個結構體__main_block_impl_0(從圖二中的***一行可以看到,block是一個指向__main_block_impl_0的指針,初始化后被類型強轉為函數(shù)指針),其中包含的__block_impl是一個公共實現(xiàn)(學過c語言的同學都知道,__main_block_impl_0的這種寫法表示其可以被類型強轉為__block_impl類型):

  1. struct __block_impl { 
  2.   void *isa; 
  3.   int Flags; 
  4.   int Reserved; 
  5.   void *FuncPtr; 
  6. };

isa指針說明block可以成為一個objc對象。

__main_block_impl_0的意思是main函數(shù)中的第0個block的implementation,這就是這個block的主體了。

這個結構體的構造函數(shù)的參數(shù):

block實際執(zhí)行代碼所在的函數(shù)的指針,當block真正被執(zhí)行時,實際上是調用了這個函數(shù),其命名也是類似的方式。

block的描述結構體,注意這個結構體聲明結束時就創(chuàng)建了一個唯一的desc,這個desc包含了block的大小,以及復制和析構block時需要額外調用的函數(shù)。

接下來是block所引用到的變量們

***是一個標記值,內部實現(xiàn)需要用到的。(我用計算器看了一下,570425344這個值等于1<<29,即BLOCK_HAS_DESCRIPTOR這個枚舉值)

所以,我們可以看到:

為什么上一篇我們說j已經不是原來的j了,因為j是作為參數(shù)傳入了block的構造函數(shù),進行了值復制。

帶有__block標記的變量會被取地址來傳入構造函數(shù),為修改其值奠定了基礎

接下來是block執(zhí)行函數(shù)__main_block_func_0:

其唯一的參數(shù)是__main_block_impl_0的指針,我們看到printf語句的數(shù)據(jù)來源都取自__cself這個指針,比較有意思的是i的取值方式(帶有__block標記的變量i被轉碼為一個結構體),先取__forward指針,再取i,這為將i復制到堆中奠定了基礎。

再下來是預定義好的兩個復制/釋放輔助函數(shù),其作用后面會講到。 

***是block的描述信息結構體 __main_block_desc_0,其包含block的內存占用長度,已經復制/釋放輔助函數(shù)的指針,其聲明結束時,就創(chuàng)建了一個名為__main_block_desc_0_DATA的結構體,我們看它構造時傳入的值,這個DATA結構體的作用就一目了然了:

長度用sizeof計算,輔助函數(shù)的指針分別為上面預定義的兩個輔助函數(shù)。

注意,如果這個block沒有使用到需要在block復制時進行copy/retian的變量,那么desc中不會有輔助函數(shù)

至此,一個block所有的部件我們都看齊全了,一個主體,一個真正的執(zhí)行代碼函數(shù),一個描述信息(可能包含兩個輔助函數(shù))。

2、構造一個block

我們進入main函數(shù):

圖一中的第三行(block的聲明),在圖二中,轉化為一個函數(shù)指針的聲明,并且都沒有被賦予初始值。

而圖一中的***一行(創(chuàng)建一個block),在圖二中,成為了對__main_block_impl_0的構造函數(shù)的調用,傳入的參數(shù)的意義上面我們已經講過了。

所以構造一個block就是創(chuàng)建了__main_block_impl_0 這個c++類的實例。

3、調用一個block

調用一個block的寫法很簡單,與調用c語言函數(shù)的語法一樣:

  1. blk(); 

其轉碼后的語句:

  1. ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk); 

將blk這個函數(shù)指針類型強轉為__block_impl類型,然后取其執(zhí)行函數(shù)指針,然后將此指針類型強轉為返回void*并接收一個__block_impl*的函數(shù)指針,***調用這個函數(shù),傳入強轉為__block_impl*類型的blk,

即調用了前述的函數(shù)__main_block_func_0

4、objective-c類成員函數(shù)中的block

源碼如下:

  1. - (void)of1 
  2.     OBJ1* oj = self; 
  3.     void (^oblk)(void) = ^{ printf("%d\n", oj.oi);}; 
  4.     Block_copy(oblk); 

這里我故意將self賦值給oj這個變量,是為了驗證前一章提出的一個結論:無法通過簡單的間接引用self來防止retain循環(huán),要避免循環(huán),我們需要__block標記(多謝樓下網友的提醒)

轉碼如下:

  1. struct __OBJ1__of1_block_impl_0 { 
  2.   struct __block_impl impl; 
  3.   struct __OBJ1__of1_block_desc_0* Desc; 
  4.   OBJ1 *oj; 
  5.   __OBJ1__of1_block_impl_0(void *fp, struct __OBJ1__of1_block_desc_0 *desc, OBJ1 *_oj, int flags=0) : oj(_oj) { 
  6.     impl.isa = &_NSConcreteStackBlock; 
  7.     impl.Flags = flags; 
  8.     impl.FuncPtr = fp; 
  9.     Desc = desc; 
  10.   } 
  11. }; 
  12. static void __OBJ1__of1_block_func_0(struct __OBJ1__of1_block_impl_0 *__cself) { 
  13.   OBJ1 *oj = __cself->oj; // bound by copy 
  14.  printf("%d\n", ((int (*)(id, SEL))(void *)objc_msgSend)((id)oj, sel_registerName("oi")));} 

objc方法中的block與c中的block并無太多差別,只是一些標記值可能不同,為了標記其是objc方法中的blcok。

注意其構造函數(shù)的參數(shù):OBJ1 *_oj

這個_oj在block復制到heap時,會被retain,而_oj與self根本就是相等的,所以,最終retain的就是self,所以如果當前實例持有了這個block,retain循環(huán)就形成了。

而一旦為其增加了__block標記:

  1. - (void)of1 
  2.     __block OBJ1 *bSelf = self; 
  3.     ^{ printf("%d", bSelf.oi); }; 
  4. }其轉碼則變?yōu)椋?nbsp;
  5.  
  6. //增加了如下行 
  7. struct __Block_byref_bSelf_0 { 
  8.   void *__isa; 
  9. __Block_byref_bSelf_0 *__forwarding; 
  10.  int __flags; 
  11.  int __size; 
  12.  void (*__Block_byref_id_object_copy)(void*, void*); 
  13.  void (*__Block_byref_id_object_dispose)(void*); 
  14.  OBJ1 *bSelf; 
  15. }; 
  16. static void __Block_byref_id_object_copy_131(void *dst, void *src) { 
  17.  _Block_object_assign((char*)dst + 40, *(void * *) ((char*)src + 40), 131); 
  18. static void __Block_byref_id_object_dispose_131(void *src) { 
  19.  _Block_object_dispose(*(void * *) ((char*)src + 40), 131); 
  20.  
  21. //聲明處變?yōu)?/span> 
  22.     __block __Block_byref_bSelf_0 bSelf = {(void*)0,(__Block_byref_bSelf_0 *)&bSelf, 33554432, sizeof(__Block_byref_bSelf_0), __Block_byref_id_object_copy_131, __Block_byref_id_object_dispose_131, self}; 

clang為我們的bSelf結構體創(chuàng)建了自己的copy/dispose輔助函數(shù),33554432(即1<<25 BLOCK_HAS_COPY_DISPOSE)這個值告訴系統(tǒng),我們的bSelf結構體具有copy/dispose輔助函數(shù)。

而131這個參數(shù)(二進制1000 0011,即BLOCK_FIELD_IS_OBJECT (3) |BLOCK_BYREF_CALLER(128))

中的BLOCK_BYREF_CALLER在內部實現(xiàn)中告訴系統(tǒng)不要進行retain或者copy,

也就是說,在 __block bSelf 被復制至heap上時,系統(tǒng)會發(fā)現(xiàn)有輔助函數(shù),而輔助函數(shù)調用后,并不retain或者copy 其結構體內的bSelf。

這樣就避免了循環(huán)retain。

小結:

當我們創(chuàng)建一個block,并調用之,編譯器為我們做的事情如下:

1.創(chuàng)建block所有的部件代碼:一個主體,一個真正的執(zhí)行代碼函數(shù),一個描述信息(可能包含兩個輔助函數(shù))。

2.將我們的創(chuàng)建代碼轉碼為block_impl的構造語句。

3.將我們的執(zhí)行語句轉碼為對block的執(zhí)行函數(shù)的調用。

下一篇我們將剖析runtime.c的源碼,并理解block的堆棧轉換。

責任編輯:閆佳明 來源: dreamingwish
相關推薦

2013-07-19 14:35:59

iOS中BlockiOS開發(fā)學習

2015-08-20 13:43:17

NFV網絡功能虛擬化

2016-11-16 09:06:59

2010-05-26 19:12:41

SVN沖突

2015-09-07 13:52:04

2021-07-28 21:49:01

JVM對象內存

2010-05-17 09:13:35

2014-03-12 11:11:39

Storage vMo虛擬機

2021-06-07 08:18:12

云計算云端阿里云

2023-11-02 09:55:40

2009-09-15 15:34:33

Google Fast

2016-04-06 09:27:10

runtime解密學習

2018-03-01 09:33:05

軟件定義存儲

2010-05-11 10:19:17

VMforceJava云計算

2009-06-01 09:04:44

Google WaveWeb

2021-09-17 15:54:41

深度學習機器學習人工智能

2015-09-08 10:06:15

2010-09-17 14:57:34

JAVA數(shù)據(jù)類型

2020-04-14 10:44:01

區(qū)塊鏈滲透測試比特幣

2021-05-25 09:01:21

Linux命令Bash histor
點贊
收藏

51CTO技術棧公眾號

中文字幕第50页| 欧洲成人在线视频| 成人一区二区三区仙踪林| 日本在线视频中文有码| 91亚洲午夜精品久久久久久| 欧美一级片免费在线| 亚洲一级片在线播放| 欧美视频三区| 91黄色免费观看| 日本福利视频网站| 福利成人在线观看| 成人精品在线视频观看| 国产精品爽爽爽| 日韩伦人妻无码| 国产精品99久久| 日韩电影中文字幕在线| 青青草原播放器| 欧美性片在线观看| 午夜欧美在线一二页| 亚洲午夜精品一区二区 | 精品久久久久久久久久久院品网 | 国产成人免费观看视频| 国产精品麻豆久久| 尤物九九久久国产精品的特点| 欧美一级大片免费看| 国产精品久久久久久久久久齐齐| 亚洲国产成人va在线观看天堂| 亚洲成人网上| 欧美巨乳在线| 95精品视频在线| 99中文视频在线| 亚洲午夜精品久久久| 免费在线亚洲欧美| 久久免费视频这里只有精品| 一区二区三区影视| 日韩精品网站| 一区二区三区亚洲| 久久精品老司机| 欧美激情极品| 亚洲国产精品va在线观看黑人| 久久久九九九热| 欧美亚洲人成在线| 欧美日韩精品久久久| 日本爱爱免费视频| 亚洲日本在线观看视频| 日韩欧美中文字幕在线观看| 热99这里只有精品| 国产高清视频色在线www| 亚洲综合精品自拍| www.avtt| 麻豆视频在线观看免费网站黄| 亚洲国产你懂的| 亚洲精品蜜桃久久久久久| 国产美女一区视频| 性欧美大战久久久久久久久| 国产一二三在线视频| a在线视频v视频| 欧美日韩日本国产| 37pao成人国产永久免费视频| 色在线视频观看| 日韩欧美国产高清91| 韩国一区二区av| 国产精品亚洲成在人线| 在线播放中文一区| 18深夜在线观看免费视频| 网站一区二区| 亚洲国产精品中文| 日本少妇色视频| 精品国产一区二区三区噜噜噜| 一本色道久久综合亚洲精品小说 | 午夜免费福利在线观看| 国产精品萝li| 欧美 日韩 国产精品| 成人三级小说| 色一区在线观看| 99re精彩视频| swag国产精品一区二区| 亚洲精品二三区| 免费黄色片网站| 99精品综合| 高清欧美性猛交| 国产寡妇亲子伦一区二区三区四区| 人人狠狠综合久久亚洲| 成人a免费视频| 日本美女一级视频| 国产婷婷色一区二区三区四区 | 一卡二卡三卡四卡| 成人羞羞网站| 欧美国产日韩在线| 无码人妻aⅴ一区二区三区有奶水| 麻豆国产精品视频| 国产欧美一区二区视频| 韩日视频在线| 一区二区三区中文在线| 欧美韩国日本在线| 精品国产一区二区三区2021| 日韩高清av在线| 影音先锋男人资源在线观看| 亚洲国产一区二区三区a毛片| 日韩美女视频在线观看| www视频在线| 国产亚洲成av人在线观看导航 | 毛片大全在线观看| 欧美性生活一区| 波多野结衣一二三区| 日韩欧美网址| 91av在线看| 性欧美8khd高清极品| 国产精品三级av在线播放| 欧美精品久久久久久久自慰| 欧美成人免费全部网站| 日韩国产精品视频| 欧美日韩在线视频免费| 日本一区中文字幕| 久久综合九九| 国产探花视频在线观看| 69堂精品视频| 欧美丰满老妇熟乱xxxxyyy| 日韩视频二区| 成人欧美一区二区三区黑人免费| av在线播放网| 色综合咪咪久久| 免费a v网站| 午夜日韩激情| 51国偷自产一区二区三区| yiren22综合网成人| 日韩人在线观看| 亚洲精品乱码久久久久久久| 欧美精品不卡| **亚洲第一综合导航网站| 99re热久久这里只有精品34| 欧美性猛交xxxx乱大交| 少妇饥渴放荡91麻豆| 在线观看日韩av电影| 亚洲自拍另类欧美丝袜| 精品国产丝袜高跟鞋| 欧美视频在线不卡| 日本乱子伦xxxx| 视频一区视频二区中文字幕| 女人一区二区三区| videos性欧美另类高清| 亚洲男人7777| www.久久久久久久| 国产亚洲视频系列| 国产自偷自偷免费一区| 国产调教一区二区三区| 国产精品第一页在线| 黄色国产在线| 欧洲精品一区二区| 国产一二三四视频| 精油按摩中文字幕久久| av动漫免费观看| 成人自拍视频| 久精品免费视频| 刘玥91精选国产在线观看| 亚洲国产人成综合网站| 久久人妻少妇嫩草av无码专区| 亚洲精品国产日韩| 久久精品国产一区二区三区不卡| 草草视频在线| 亚洲欧美资源在线| 中文永久免费观看| 国产精品国产a| 九色91porny| 亚洲久久视频| 日本在线成人一区二区| 小明成人免费视频一区| 久久好看免费视频| 黄频在线免费观看| 色综合久久久久综合体| 99久久99久久精品免费| 国产在线播放一区二区三区| 欧美高清中文字幕| 婷婷综合一区| 国产日韩欧美另类| 美洲精品一卡2卡三卡4卡四卡| 日韩精品欧美激情| 中文字幕人妻互换av久久| 亚洲三级在线免费观看| 艳妇乳肉豪妇荡乳xxx| 日韩中文字幕av电影| 日本丰满大乳奶| 欧美国产不卡| 91亚洲精华国产精华| 精精国产xxxx视频在线播放| 伊人久久男人天堂| 成 人 黄 色 片 在线播放| 欧美日韩精品在线播放| 日韩欧美在线视频播放| 99久久亚洲一区二区三区青草| 91色国产在线| 亚洲夜间福利| 亚洲看片网站| 老司机在线精品视频| 成人福利在线视频| 国模精品视频| 久久久国产精彩视频美女艺术照福利| 十八禁一区二区三区| 欧美专区亚洲专区| 国产一级片播放| 国产精品久久久久三级| 欧美成人三级伦在线观看| 久久国产欧美日韩精品| 国产免费黄视频| 真实国产乱子伦精品一区二区三区| 久久精精品视频| 日本一区二区三区视频在线看| 国产成+人+综合+亚洲欧美丁香花| av超碰免费在线| 中文亚洲视频在线| 少妇激情av一区二区| 欧美变态口味重另类| 91欧美日韩麻豆精品| 91精品91久久久中77777| 久久综合加勒比| 亚洲欧美视频在线观看| 一级黄色片网址| 26uuu国产日韩综合| 中国极品少妇xxxx| 国产精品一区在线| 激情在线观看视频| 蜜桃av噜噜一区| 国产精品第12页| 一本色道精品久久一区二区三区| 六月婷婷激情网| 93在线视频精品免费观看| 日韩欧美亚洲区| 欧洲专线二区三区| 欧美日韩国产精品一卡| 美女扒开腿让男人桶爽久久动漫| 成人国产一区二区| 日本一区二区三区电影免费观看| 成人免费网视频| 亚洲国产一区二区久久| 国产在线拍偷自揄拍精品| 成人在线网站| 国产精品久久激情| 亚洲成人激情社区| 国产精品成人在线| 国产电影一区二区三区爱妃记| 欧美在线视频导航| 三上悠亚一区二区| 国产成人精品999| 综合在线影院| 国产精品网址在线| 自拍偷拍亚洲| 91亚洲人电影| 亚洲日本va中文字幕| 97久久天天综合色天天综合色hd| 欧一区二区三区| 国产精选在线观看91| 国内精品偷拍| 欧美人与物videos另类| 国产欧美日韩在线一区二区| 日韩欧美一区二区视频在线播放| 精品久久影院| 自拍偷拍99| 欧美激情成人在线| 亚洲人精品午夜射精日韩| 另类亚洲自拍| www.com黄色片| 国产一区二区三区免费观看| 永久免费看片在线观看| 91色综合久久久久婷婷| 亚洲区自拍偷拍| 亚洲视频一区二区免费在线观看| 免费一级黄色大片| 狠狠躁夜夜躁人人爽天天天天97| 欧美一级淫片免费视频黄| 精品视频色一区| 性生交大片免费看女人按摩| 亚洲国产精品va在线看黑人动漫| 欧美视频综合| 久久精品精品电影网| caoporn-草棚在线视频最| 国产91在线播放九色快色| 成人乱码手机视频| 国产精品免费一区二区三区观看| 亚洲激情77| 一级黄色录像免费看| 日韩视频一区二区三区在线播放免费观看| 国产偷人视频免费| 国模大尺度一区二区三区| 久久久久久婷婷| 中文字幕第一区综合| 久久久美女视频| 在线免费观看一区| 国产黄色av片| 国产一区二区三区精品久久久| caoporn免费在线| 欧美中文字幕在线播放| 97久久中文字幕| 美女亚洲精品| 亚洲区综合中文字幕日日| 免费无遮挡无码永久视频| 久久er99热精品一区二区| 99久久久无码国产精品性波多| 久久久www免费人成精品| 午夜精品福利在线视频| 欧美视频裸体精品| 午夜精品久久久久久久爽 | 国产视频一区二区三区四区| 不卡视频在线| av免费看网址| 国内久久精品视频| 老熟妇一区二区| 亚洲成人一区在线| 国产精品伦理一区| 国产性色av一区二区| 成人av影院在线观看| 成人精品久久一区二区三区| 精品中文字幕一区二区三区av| 男人添女人荫蒂免费视频| 激情五月激情综合网| 成年人免费观看视频网站| 午夜精品久久久久久久久| 97在线公开视频| 伊人伊成久久人综合网站| 岛国av在线播放| 国产精品久久国产三级国电话系列| 欧美jizz| 特级丰满少妇一级| 久久久精品一品道一区| 国产精品999在线观看| 精品国产免费视频| 成人短视频在线观看| 成人国产精品一区| 日韩电影免费网址| 狠狠躁狠狠躁视频专区| 久久久99久久精品欧美| 韩国av中文字幕| 日韩精品欧美国产精品忘忧草| 123区在线| 国产一区再线| 国产亚洲激情| 国产三级国产精品| 欧美丝袜一区二区| 日韩porn| 日产精品99久久久久久| 神马久久影院| 国产91美女视频| 久久久久青草大香线综合精品| 久久午夜免费视频| 日韩精品在线电影| 三上悠亚激情av一区二区三区| 欧美日韩在线播放一区二区| 欧美一级久久| 女女互磨互喷水高潮les呻吟| 色国产精品一区在线观看| 波多野结衣在线影院| 国产日韩在线一区| 91精品国产乱码久久久久久| 又黄又爽又色的视频| 亚洲午夜在线观看视频在线| 色呦呦视频在线| 国产z一区二区三区| 黄色不卡一区| av亚洲天堂网| 一区二区久久久久久| 丰满人妻一区二区三区四区53| 午夜精品福利在线观看| 综合干狼人综合首页| 久久99999| 一区二区三区在线视频观看| 可以免费看毛片的网站| 国产成人精品av在线| 天天射天天综合网| 一级黄色免费视频| 色婷婷av一区二区三区软件| 日韩在线免费电影| 91嫩草在线| 国产精品久久777777毛茸茸| 人与嘼交av免费| 日韩精品一区二区三区在线播放| av中文在线资源库| 亚洲不卡一卡2卡三卡4卡5卡精品| 日韩电影免费在线看| 国产精品免费人成网站酒店| 亚洲成成品网站| 亚洲一区二区三区四区| 99中文字幕在线观看| 91久色porny| 91精品在线视频观看| 久久久久一本一区二区青青蜜月| 久久99视频| 99免费观看视频| 欧美亚洲国产一区二区三区 | 日本中文字幕一区二区有码在线| 国产精品美女久久久久久免费| 欧美日韩p片| xxxx日本黄色| 精品国产乱码久久久久久牛牛| 美女网站视频一区| 97中文字幕在线| 久久久久国产精品厨房| 99久久精品免费看国产交换| 日本视频久久久| 精久久久久久| 综合五月激情网| 国产亚洲欧洲黄色|