久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

        手機站
        千鋒教育

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

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

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

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

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

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

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

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

        二、block是什么

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

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

        block標準語法:

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

        三、Block底層實現

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

        block 的內存結構圖:

        Block_layout結構體成員含義如下:

        isa: 指向所屬類的指針,也就是block的類型flags: 標志變量,在實現block的內部操作時會用到Reserved: 保留變量invoke: block執(zhí)行時調用的函數指針,block內部的執(zhí)行代碼都在這個函數中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年以上業(yè)內強師集結,手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師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
        MySQL數據庫char類型的長度是什么意思?

        一、MySQL數據庫char類型的長度是什么意思MySQL數據庫char類型的長度是指該字段所占用的字節(jié)數。char數據類型是MySQL中固定長度的字符類型。 我...詳情>>

        2023-10-13 13:51:32
        “數據庫”領域里面的“數據字典”到底是什么?

        一、“數據庫”領域里面的“數據字典”到底是什么數據字典是一個存放有數據庫所用的有關信息,在數據庫設計的初期將數據庫中的各類數據的描述集...詳情>>

        2023-10-13 13:49:07
        微博feed系統(tǒng)的推模式和拉模式的架構是怎樣的?

        一、微博feed系統(tǒng)的推模式架構1、發(fā)布服務負責生成用戶的消息,將消息推送到數據發(fā)布中心。2、推送服務在接收到新消息后,根據消息的類型和內容...詳情>>

        2023-10-13 13:28:55
        Oracle數據庫運行越來越慢,應該怎么優(yōu)化?

        一、Oracle數據庫運行越來越慢的優(yōu)化方法1、應用層優(yōu)化應用程序的設計和開發(fā)中,可以采用合理的數據查詢語句來減少數據庫的 I/O 操作次數,例如...詳情>>

        2023-10-13 13:27:44
        mysql當數據同時屬于多個分類時,該怎么查詢?

        一、mysql當數據同時屬于多個分類時,該怎么查詢1、使用 AND 連接符可以將多個分類條件使用 AND 連接符連接起來,下面是代碼示例:SELECT * FRO...詳情>>

        2023-10-13 13:23:03
        桓台县| 资兴市| 江油市| 衡山县| 武陟县| 兰西县| 定远县| 西畴县| 井冈山市| 湘潭县| 石棉县| 浦北县| 扶沟县| 沧源| 红桥区| 合江县| 河北区| 灵宝市| 平昌县| 舒兰市| 东乌| 丰原市| 兰考县| 伊宁县| 石棉县| 南宫市| 深圳市| 元谋县| 东乌珠穆沁旗| 新乡县| 原阳县| 溧水县| 朝阳县| 永和县| 日喀则市| 青龙| 富裕县| 巴塘县| 阆中市| 西昌市| 建始县|