__forwarding指針

__forwarding指針

上面提到過__forwarding指針指向的是結(jié)構(gòu)體自己。當(dāng)使用變量的時候,通過結(jié)構(gòu)體找到__forwarding指針,在通過__forwarding指針找到相應(yīng)的變量。這樣設(shè)計的目的是為了方便內(nèi)存管理。通過上面對__block變量的內(nèi)存管理分析我們知道,block被復(fù)制到堆上時,會將block中引用的變量也復(fù)制到堆中。

我們重回到源碼中。當(dāng)在block中修改__block修飾的變量時。

static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  __Block_byref_age_0 *age = __cself->age; // bound by ref
            (age->__forwarding->age) = 20;
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_jm_dztwxsdn7bvbz__xj2vlp8980000gn_T_main_b05610_mi_0,(age->__forwarding->age));
        }

通過源碼可以知道,當(dāng)修改__block修飾的變量時,是根據(jù)變量生成的結(jié)構(gòu)體這里是__Block_byref_age_0找到其中__forwarding指針,__forwarding指針指向的是結(jié)構(gòu)體自己因此可以找到age變量進行修改。

當(dāng)block在棧中時,__Block_byref_age_0結(jié)構(gòu)體內(nèi)的__forwarding指針指向結(jié)構(gòu)體自己。

而當(dāng)block被復(fù)制到堆中時,棧中的__Block_byref_age_0結(jié)構(gòu)體也會被復(fù)制到堆中一份,而此時棧中的__Block_byref_age_0結(jié)構(gòu)體中的__forwarding指針指向的就是堆中的__Block_byref_age_0結(jié)構(gòu)體,堆中__Block_byref_age_0結(jié)構(gòu)體內(nèi)的__forwarding指針依然指向自己。

此時當(dāng)對age進行修改時

// 棧中的age
__Block_byref_age_0 *age = __cself->age; // bound by ref
// age->__forwarding獲取堆中的age結(jié)構(gòu)體
// age->__forwarding->age 修改堆中age結(jié)構(gòu)體的age變量
(age->__forwarding->age) = 20;

通過__forwarding指針巧妙的將修改的變量賦值在堆中的__Block_byref_age_0中。

我們通過一張圖展示__forwarding指針的作用

因此block內(nèi)部拿到的變量實際就是在堆上的。當(dāng)block進行copy被復(fù)制到堆上時,_Block_object_assign函數(shù)內(nèi)做的這一系列操作。

2020面試刷題與技術(shù)儲備專區(qū)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容