国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

            當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > block為什么能夠捕獲外界變量?

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

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

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

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

            二、block是什么

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

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

            block標(biāo)準(zhǔn)語(yǔ)法:

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

            三、Block底層實(shí)現(xiàn)

            block的底層實(shí)現(xiàn)是結(jié)構(gòu)體,和類(lèi)的底層實(shí)現(xiàn)類(lèi)似,都有isa指針,可以把block當(dāng)成是一個(gè)對(duì)象。下面通過(guò)創(chuàng)建一個(gè)控制臺(tái)程序,來(lái)窺探block的底層實(shí)現(xiàn)。

            block 的內(nèi)存結(jié)構(gòu)圖:

            Block_layout結(jié)構(gòu)體成員含義如下:

            isa: 指向所屬類(lèi)的指針,也就是block的類(lèi)型flags: 標(biāo)志變量,在實(shí)現(xiàn)block的內(nèi)部操作時(shí)會(huì)用到Reserved: 保留變量invoke: block執(zhí)行時(shí)調(diào)用的函數(shù)指針,block內(nèi)部的執(zhí)行代碼都在這個(gè)函數(shù)中descriptor: block的詳細(xì)描述,包含 copy/dispose 函數(shù),處理block引用外部變量時(shí)使用variables: block范圍外的變量,如果block沒(méi)有調(diào)用任何外部變量,該變量就不存在

            Block_descriptor結(jié)構(gòu)體成員含義如下:

            reserved: 保留變量size: block的內(nèi)存大小copy: 拷貝block中被 __block 修飾的外部變量dispose: 和 copy 方法配置應(yīng)用,用來(lái)釋放資源

            具體實(shí)現(xiàn)代碼:

            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類(lèi)型

            NSGlobalBlock:沒(méi)有訪問(wèn)auto變量NSStackBlock:訪問(wèn)了auto變量NSMallocBlock:調(diào)用了copy
            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
            請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
            免費(fèi)領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學(xué) 138****2860 剛剛成功領(lǐng)取
            王同學(xué) 131****2015 剛剛成功領(lǐng)取
            張同學(xué) 133****4652 剛剛成功領(lǐng)取
            李同學(xué) 135****8607 剛剛成功領(lǐng)取
            楊同學(xué) 132****5667 剛剛成功領(lǐng)取
            岳同學(xué) 134****6652 剛剛成功領(lǐng)取
            梁同學(xué) 157****2950 剛剛成功領(lǐng)取
            劉同學(xué) 189****1015 剛剛成功領(lǐng)取
            張同學(xué) 155****4678 剛剛成功領(lǐng)取
            鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
            董同學(xué) 138****2867 剛剛成功領(lǐng)取
            周同學(xué) 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            MySQL數(shù)據(jù)庫(kù)char類(lèi)型的長(zhǎng)度是什么意思?

            一、MySQL數(shù)據(jù)庫(kù)char類(lèi)型的長(zhǎng)度是什么意思MySQL數(shù)據(jù)庫(kù)char類(lèi)型的長(zhǎng)度是指該字段所占用的字節(jié)數(shù)。char數(shù)據(jù)類(lèi)型是MySQL中固定長(zhǎng)度的字符類(lèi)型。 我...詳情>>

            2023-10-13 13:51:32
            “數(shù)據(jù)庫(kù)”領(lǐng)域里面的“數(shù)據(jù)字典”到底是什么?

            一、“數(shù)據(jù)庫(kù)”領(lǐng)域里面的“數(shù)據(jù)字典”到底是什么數(shù)據(jù)字典是一個(gè)存放有數(shù)據(jù)庫(kù)所用的有關(guān)信息,在數(shù)據(jù)庫(kù)設(shè)計(jì)的初期將數(shù)據(jù)庫(kù)中的各類(lèi)數(shù)據(jù)的描述集...詳情>>

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

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

            2023-10-13 13:28:55
            Oracle數(shù)據(jù)庫(kù)運(yùn)行越來(lái)越慢,應(yīng)該怎么優(yōu)化?

            一、Oracle數(shù)據(jù)庫(kù)運(yùn)行越來(lái)越慢的優(yōu)化方法1、應(yīng)用層優(yōu)化應(yīng)用程序的設(shè)計(jì)和開(kāi)發(fā)中,可以采用合理的數(shù)據(jù)查詢(xún)語(yǔ)句來(lái)減少數(shù)據(jù)庫(kù)的 I/O 操作次數(shù),例如...詳情>>

            2023-10-13 13:27:44
            mysql當(dāng)數(shù)據(jù)同時(shí)屬于多個(gè)分類(lèi)時(shí),該怎么查詢(xún)?

            一、mysql當(dāng)數(shù)據(jù)同時(shí)屬于多個(gè)分類(lèi)時(shí),該怎么查詢(xún)1、使用 AND 連接符可以將多個(gè)分類(lèi)條件使用 AND 連接符連接起來(lái),下面是代碼示例:SELECT * FRO...詳情>>

            2023-10-13 13:23:03
            快速通道