淺談Block內(nèi)存管理

1. block的底層實(shí)現(xiàn)原理

  • block實(shí)際上是指向結(jié)構(gòu)體的指針;block傳值時:普通的局部變量是值傳遞,全局變量、被static修飾的局部變量或者被__block修飾的局部變量都是地址傳遞
//普通的局部變量-->值傳遞
void test1()
{
    int a = 10;
    
    void(^block)() = ^{
        NSLog(@"a is %d",a);
    };
    a = 20;
    block();
}
此時打印出來的東西是a is 10(值傳遞)。

//全局變量-->地址傳遞
int a = 10;
void test2()
{
    void(^block)() = ^{
        NSLog(@"a is %d",a);
    };
    a = 20;
    block();
}
此時打印出來的東西是a is 20(地址傳遞)。

//被__block修飾的局部變量-->地址傳遞
void test3()
{
    __block a = 10;
    
    void(^block)() = ^{
        NSLog(@"a is %d",a);
    };
    a = 20;
    block();
}
此時打印出來的東西是a is 20(地址傳遞)。

//被static修飾的局部變量-->地址傳遞
void test4()
{
    static a = 10;
    
    void(^block)() = ^{
        NSLog(@"a is %d",a);
    };
    a = 20;
    block();
}
此時打印出來的東西是a is 20(地址傳遞)。
  • 在查看block底層實(shí)現(xiàn)原理的過程中,需要把系統(tǒng)的OC代碼轉(zhuǎn)換成c++代碼,具體的轉(zhuǎn)化需要在終端找到文件路徑并執(zhí)行以下代碼:
 clang - rewrite-objc ***(文件名)

2. block的內(nèi)存管理

  • 默認(rèn)情況下block的內(nèi)存是在棧中(不需要手動去管理block內(nèi)存),它不會對所引用的對象進(jìn)行任何操作
  • 如果對block進(jìn)行了copy操作, block的內(nèi)存會搬到堆里面,它會對所引用的對象做一次retain操作
注意:
非ARC: 如果所引用的對象用了__block修飾,就不會做retain操作。
ARC: 如果所引用的對象用了__unsafe_unretained\__weak修飾,就不會做retain操作。
為什么加上 __block就可以修改外部的變量了?

真正的原因是這樣的:
我們都知道:Block不允許修改外部變量的值,這里所說的外部變量的值,指的是棧中指針的內(nèi)存地址。__block
所起到的作用就是只要觀察到該變量被 block 所持有,就將“外部變量”在棧中的內(nèi)存地址放到了堆中。進(jìn)而在block內(nèi)部也可以修改外部變量的值。

站在巨人的肩膀上,本文借鑒@M了個J小馬哥教程.謝謝??

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

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

  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 814評論 2 1
  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計(jì)數(shù)、block、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 10,085評論 10 69
  • 前言 Blocks是C語言的擴(kuò)充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,851評論 0 23
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機(jī)制。與retain配對使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,080評論 1 16
  • 一個人的成就,取決于他在有效的時間內(nèi)完成的業(yè)績,時間管理的重點(diǎn)就是學(xué)會分配時間,在每一分每一秒都做最有效率的事情,...
    秦默閱讀 174評論 0 0

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