麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > block為什么能夠捕獲外界變量?

block為什么能夠捕獲外界變量?

來源:千鋒教育
發布人:xqq
時間: 2023-10-13 12:03:20 1697169800

一、block能夠捕獲外界變量的原因

在定義Block的時候,外界變量被編譯器轉換成了結構體成員變量,并且在調用Block的時候,這些變量的值會被拷貝到Block的結構體實例中。這樣一來,即使在Block執行之后,這些變量的作用域已經結束,它們的值也能夠保留下來,并且能夠在Block內部繼續使用。這種特性就是Block所具有的閉包特性,也是它能夠捕獲外界變量的原因。

二、block是什么

block是一種封裝了代碼塊的數據類型,可以在C、Objective-C和Swift中使用。它類似于函數或方法,但具有更靈活的特性,可以嵌套在其他代碼塊中使用,并且能夠捕獲外部變量。block可以作為參數傳遞給函數或方法,也可以作為返回值返回。在異步編程、多線程和事件處理等場景中,block被廣泛應用。

block就是一個代碼塊, block是將函數及其執行上下文封裝起來的對象,是一個匿名的函數對象, block也有isa。既然block內部封裝了函數,那么它同樣也有參數和返回值,本身也可以被作為參數在方法和函數間傳遞。

block標準語法:

return_type (^blockName)(var_type) = ^return_type (var_type varName) {    // ...};blockName(var);

三、Block底層實現

block的底層實現是結構體,和類的底層實現類似,都有isa指針,可以把block當成是一個對象。下面通過創建一個控制臺程序,來窺探block的底層實現。

block 的內存結構圖:

Block_layout結構體成員含義如下:

isa: 指向所屬類的指針,也就是block的類型flags: 標志變量,在實現block的內部操作時會用到Reserved: 保留變量invoke: block執行時調用的函數指針,block內部的執行代碼都在這個函數中descriptor: block的詳細描述,包含 copy/dispose 函數,處理block引用外部變量時使用variables: block范圍外的變量,如果block沒有調用任何外部變量,該變量就不存在

Block_descriptor結構體成員含義如下:

reserved: 保留變量size: block的內存大小copy: 拷貝block中被 __block 修飾的外部變量dispose: 和 copy 方法配置應用,用來釋放資源

具體實現代碼:

enum {    BLOCK_REFCOUNT_MASK =     (0xffff),    BLOCK_NEEDS_FREE =        (1 << 24),    BLOCK_HAS_COPY_DISPOSE =  (1 << 25),    BLOCK_HAS_CTOR =          (1 << 26), /* Helpers have C++ code. */    BLOCK_IS_GC =             (1 << 27),    BLOCK_IS_GLOBAL =         (1 << 28),    BLOCK_HAS_DESCRIPTOR =    (1 << 29)};/* Revised new layout. */struct Block_descriptor {    unsigned long int reserved;    unsigned long int size;    void (*copy)(void *dst, void *src);    void (*dispose)(void *);};struct Block_layout {    void *isa;    int flags;    int reserved;     void (*invoke)(void *, ...);    struct Block_descriptor *descriptor;    /* Imported variables. */};

延伸閱讀1:block類型

NSGlobalBlock:沒有訪問auto變量NSStackBlock:訪問了auto變量NSMallocBlock:調用了copy
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 俺也去第四色| aaa一级黄色片| 国内一级黄色片| 亚洲乱码一二三四五六区| 日本特黄特黄刺激大片| 99re在线视频免费观看| 妞干网手机免费视频| 亚洲国产成人久久综合区| 吃奶摸下激烈视频无遮挡| 美女羞羞视频免费网站| 国产精品亲子乱子伦xxxx裸| 日本成人在线免费| 福利二区视频| 久久久久久亚洲精品| 一本热久久sm色国产| 亚洲国产精品va在线观看麻豆| а天堂中文最新版在线| 久久亚洲国产精品五月天婷| 性伴交换多p| 大学生男男澡堂69gaysex| 特a级片| 十七岁高清在线观看| 黄瓜视频在线观看| 污污的小说片段| 国产**aa全黄毛片| loveme动漫在线观看免费| 日本爽爽爽爽爽爽在线观看免| 污网站在线观看| 中文字幕一二三四区2021| 麻豆精品不卡国产免费看 | 一个人看的www免费高清中文字幕 樱花草在线社区www韩国 | 美女裸体a级毛片| 成人免费福利电影| 欧美日韩国产另类一区二区三区| 日韩乱码在线观看| 日本年轻的妈妈| 果冻传媒电影免费看| а√天堂资源8在线官网在线| 蜜中蜜3在线观看视频| 一级毛片免费观看不收费| 精品国产不卡一区二区三区|