精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美婷婷在线| 日本成人在线网站| 99v久久综合狠狠综合久久| 91av视频在线播放| xxxx日本黄色| 免费精品一区| 色综合久久99| 99热这里只有精品7| 天天操天天干天天舔| 日本不卡视频在线| 欧美精品激情blacked18| 一二三不卡视频| 亚洲伊人精品酒店| 高潮白浆女日韩av免费看| 亚洲一区二区在线看| 欧美一级特黄aaaaaa大片在线观看| 老司机精品福利视频| 久久成人一区二区| 全黄一级裸体片| 欧美成年网站| 在线视频中文字幕一区二区| 男人c女人视频| av色图一区| 99精品国产热久久91蜜凸| 成人福利视频网| 特级做a爱片免费69| 欧美日韩视频| 日韩网站免费观看高清| 人妻无码一区二区三区| 亚洲国产中文在线| 欧美日韩亚洲另类| 男女av免费观看| 9lporm自拍视频区在线| 亚洲三级在线免费观看| 色视频一区二区三区| 亚洲欧美日韩精品永久在线| 国产成人亚洲精品狼色在线| 成人在线免费观看视视频| 亚洲综合久久网| 亚洲一区国产| 久久久久久久91| 青青青在线免费观看| 97精品97| 精品国产欧美一区二区五十路| b站大片免费直播| 日韩mv欧美mv国产网站| 精品不卡在线视频| 国产精品一级无码| 精品国产乱码一区二区三区| 欧美日本一道本在线视频| 欧美日韩在线观看不卡| 久久久人成影片一区二区三区在哪下载| 亚洲va中文字幕| 男人天堂av片| 国产在线美女| 欧美日韩亚洲视频一区| 9久久9毛片又大又硬又粗| 黄色羞羞视频在线观看| 亚洲国产精品一区二区www在线| 97精品国产97久久久久久粉红| 麻豆视频在线观看免费| 亚洲蜜臀av乱码久久精品| 中国一区二区三区| 米奇精品一区二区三区| 亚洲色图视频免费播放| 免费的av在线| √最新版天堂资源网在线| 亚洲综合999| 天天夜碰日日摸日日澡性色av| 国产美女情趣调教h一区二区| 亚洲成人av在线电影| 日本国产在线播放| 欧美www.| 欧美麻豆精品久久久久久| 国产黄色一区二区三区| 9l视频自拍蝌蚪9l视频成人| 亚洲精品白浆高清久久久久久| 毛片网站免费观看| 色婷婷综合网| 欧美黑人一级爽快片淫片高清| 国产午夜在线播放| 美女性感视频久久| 成人羞羞视频免费| 亚洲欧美日韩免费| 国产欧美日韩激情| 99热一区二区三区| 国产白浆在线免费观看| 在线观看国产日韩| 手机在线观看日韩av| 好吊妞国产欧美日韩免费观看网站| 日韩久久免费电影| 日韩欧美国产成人精品免费| 一本久道久久久| 国产精品免费福利| 亚洲国产精品国自产拍久久| 久久亚洲欧美国产精品乐播| 青草全福视在线| 亚洲同志男男gay1069网站| 欧美日本一区二区在线观看| 亚洲天堂2024| 99国产精品免费视频观看| 欧美精品久久久久久久久久| 中国女人真人一级毛片| 成人一道本在线| 亚洲欧美99| 日韩脚交footjobhdboots| 欧美人牲a欧美精品| 国产精品麻豆入口| 99九九热只有国产精品| 欧美性受xxx| aaa一区二区三区| 99久久精品免费观看| 精品日韩在线播放| 日韩中文影院| 亚洲韩国日本中文字幕| 日本二区三区视频| 久久五月激情| 国产精品久久亚洲| 麻豆传媒在线免费看| 日韩欧美在线观看视频| 91亚洲一线产区二线产区| 成人vr资源| 51精品在线观看| 丰满熟妇人妻中文字幕| 亚洲欧美激情一区二区| 亚洲激情在线观看视频| 竹菊久久久久久久| 久久免费精品视频| 国产视频在线观看免费| 国产精品久99| 欧美三级理论片| 香蕉久久精品日日躁夜夜躁| 久久久久久久久久婷婷| 国产女人爽到高潮a毛片| 欧美国产1区2区| 成人免费无码av| 久久不见久久见免费视频7| 韩国欧美亚洲国产| 亚洲国产精品久久久久久久| 亚洲欧美日韩国产综合在线| 韩国中文字幕av| 欧洲杯足球赛直播| 日韩美女主播视频| 欧洲视频在线免费观看| 欧美日韩性生活视频| 艳妇乳肉亭妇荡乳av| 亚洲另类黄色| 国产伦精品一区二区三区在线 | 全黄性性激高免费视频| 麻豆国产精品| 久久99亚洲精品| 国产 日韩 欧美 精品| 亚洲一区中文在线| 国产av一区二区三区传媒| 欧美日韩视频一区二区三区| 国产激情一区二区三区在线观看| 牛牛精品在线视频| 亚洲精品一区二区三区福利 | 巨大荫蒂视频欧美大片| 91麻豆精品国产自产在线观看一区 | av中文字幕网址| 91久久高清国语自产拍| 91麻豆桃色免费看| 性xxxfreexxxx性欧美| 日韩免费成人网| 亚洲天堂日韩av| 91老师片黄在线观看| 国产三级三级三级看三级| 日韩精品诱惑一区?区三区| 91精品视频在线播放| av在线下载| 亚洲韩国日本中文字幕| 无码人妻一区二区三区免费| 中文字幕乱码一区二区免费| 亚洲综合伊人久久| 亚洲精品美女| 日韩免费三级| 日韩一级淫片| 日产精品久久久一区二区福利| 亚洲s色大片| 精品国产一区二区三区久久久蜜月| 精品美女久久久久| 欧美国产精品劲爆| 免费观看一区二区三区| 麻豆9191精品国产| 欧美精品一区二区性色a+v| 成人偷拍自拍| 国产精品美女网站| a'aaa级片在线观看| 中文字幕日韩在线观看| 成人久久精品人妻一区二区三区| 日韩欧美国产网站| 加勒比婷婷色综合久久| 91丨九色丨黑人外教| 久久国产这里只有精品| 精品96久久久久久中文字幕无| 日产国产精品精品a∨| 亚洲成av人片在线观看www| 欧洲成人性视频| 91精品久久久久久粉嫩| 亚洲欧美精品伊人久久| av片免费播放| 在线免费一区三区| 国产污视频在线看| 国产精品久久久久影院亚瑟| 久久午夜夜伦鲁鲁片| 国产乱人伦精品一区二区在线观看 | 久久久久久久尹人综合网亚洲| 国产91视频一区| 欧美影院三区| 免费精品视频一区| 综合久久成人| 国产欧美日韩中文字幕| 超碰国产一区| 久久琪琪电影院| 黄色精品免费看| 伊人伊人伊人久久| 日本黄色大片视频| 91精品国产免费| 最近中文字幕av| 色综合久久九月婷婷色综合| www.youjizz.com亚洲| 中文字幕综合网| 91资源在线播放| 91网址在线看| 在线天堂www在线国语对白| 国产精品一级二级三级| 欧美日韩一区二区三区69堂| 羞羞答答国产精品www一本| 丁香六月激情婷婷| 欧美视频成人| 99中文字幕在线观看| 午夜精品久久久久久久四虎美女版| 欧美极品一区| 欧美日韩xxxx| 欧美色欧美亚洲另类七区| 欧美午夜寂寞| 韩国成人av| 精品福利一区| 国产麻豆日韩| 精品亚洲免a| 国产一区在线观| 久久成人福利| 久久99九九| 自拍欧美一区| 日本一区视频在线观看| 欧美日韩爱爱| 亚洲国产欧美一区二区三区不卡| jiujiure精品视频播放| 亚洲一区二区三区精品在线观看| 精品国产一区二区三区久久久樱花| 日韩aⅴ视频一区二区三区| 久久超碰99| 日韩在线观看电影完整版高清免费| 国产中文字幕一区二区三区| 神马欧美一区二区| 色天天久久综合婷婷女18| 正在播放亚洲| 国产精品v日韩精品v欧美精品网站 | 国产一区免费视频| 一道本一区二区三区| 欧美色图亚洲自拍| 欧美肥老太太性生活| 在线视频91| 国产精品激情电影| 极品美女扒开粉嫩小泬| 日本一不卡视频| 九一精品久久久| 成人午夜电影网站| 人妻熟女aⅴ一区二区三区汇编| 久久久美女毛片| 亚洲女同二女同志奶水| 亚洲人成网站色在线观看| 国产亚洲第一页| 色婷婷综合激情| 国产又黄又粗又猛又爽| 精品人伦一区二区色婷婷| 色在线免费视频| 久久精品亚洲一区| 国产三级电影在线播放| 国产精品嫩草视频| 视频精品二区| 日本一区高清不卡| 欧美成人高清| 欧美激情成人网| 国产传媒一区在线| av中文字幕免费观看| 一区二区三区四区不卡在线| 亚洲成人第一网站| 欧美一级午夜免费电影| 免费一级毛片在线观看| 久久久精品电影| 日本综合字幕| 亚洲最大av在线| 国产精品片aa在线观看| 日韩欧美猛交xxxxx无码| 久久中文精品| 91精产国品一二三| 欧美激情中文字幕一区二区| 国产一级久久久| 欧美喷潮久久久xxxxx| 你懂的网站在线| 久久激情五月丁香伊人| 二区三区不卡| 国产亚洲精品美女久久久m| 久久日文中文字幕乱码| 久久久噜噜噜www成人网| 国产精品夜夜嗨| 久草福利资源在线| 欧美午夜宅男影院在线观看| 国产jzjzjz丝袜老师水多| 亚洲日本成人女熟在线观看| aa级大片免费在线观看| 91黄色精品| 性xxxx欧美老肥妇牲乱| 国产三级三级三级看三级| gogogo免费视频观看亚洲一| 欧美日韩一级在线观看| 欧美乱熟臀69xxxxxx| 国产在线视频福利| 欧美一级大片在线观看| 91蝌蚪精品视频| 五月天综合婷婷| 精品一区二区三区在线播放视频| 中文字幕国产专区| 午夜精品一区在线观看| 性生交大片免费看女人按摩| 久久精品国产一区二区三区| 91成人在线| 四虎永久国产精品| 嫩草成人www欧美| 亚洲av无码一区二区三区观看| 亚洲午夜久久久| www.99视频| 久久99青青精品免费观看| 精品视频在线播放一区二区三区| 亚洲三级一区| 久久精品免费看| 人成免费在线视频| 欧美在线一二三| jzzjzzjzz亚洲成熟少妇| 国产成+人+综合+亚洲欧美丁香花| 色88888久久久久久影院| 久久久久久久午夜| 91免费小视频| 日本视频在线观看免费| 亚洲人成在线观| 99蜜月精品久久91| 亚洲图片都市激情| 久久99久久99| 日本中文字幕免费在线观看| 制服丝袜亚洲网站| 亚洲大胆人体大胆做受1| 超碰97网站| 亚洲美女少妇无套啪啪呻吟| 一区二区免费在线观看视频| 狠狠躁夜夜躁人人爽超碰91| 精品久久av| 国产美女被下药99| 亚洲精品91| 中文成人无字幕乱码精品区| 欧美日韩中文在线观看| 番号集在线观看| 国产日韩在线观看av| 欧美国产91| 欧美在线一级片| 欧美亚洲自拍偷拍| 欧美成人hd| 国产精品成人观看视频免费| 国产精品资源| 国产毛片欧美毛片久久久| 欧美肥妇毛茸茸| 国产蜜臀av在线播放| 日本欧美色综合网站免费| 免费在线观看视频一区| 婷婷激情四射网| 亚洲国产成人在线播放| 国模一区二区| 国产精品一二三在线观看| 99久久精品免费| 一区二区三区精彩视频| 久久久久久久久中文字幕| 国产成人三级| 日韩大尺度视频| 一本大道久久a久久精品综合| 免费黄网站在线| 精品久久久久久中文字幕动漫| 奇米一区二区三区| 国产精品第一页在线观看| 中文字幕欧美精品日韩中文字幕| 日韩一区二区三区精品视频第3页| 欧美日韩精品在线一区二区| 国产精品国产成人国产三级| 丁香花免费高清完整在线播放| 国产精品高精视频免费| 黄色日韩精品| 日本伦理一区二区三区| 亚洲国产精品久久久| 亚洲成a人片777777久久| 无码精品a∨在线观看中文|