程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 經驗之談—讓你看明白block

經驗之談—讓你看明白block

編輯:關於C語言

經驗之談—讓你看明白block


其實我感覺不經常使用block的朋友,對block應該是比較陌生的,那麼現在我們來扒開block的真面目,看看block的本質

普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變

void test()
{
    int age = 10;
    void (^block)() = ^{
        // 普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變
        NSLog(@"----age=%d", age);
    };

    age = 20;

    block();
}

這裡的結果是10;其實在編譯的時候,是相當於這樣的:

void test2()
{
    int age = 10;
    void (^block)() = ^{
        // 普通的局部變量,block內部只會引用它初始的值(block定義那一刻),不能跟蹤它的改變
        NSLog(@"----age=%d", 10);
    };

    age = 20;

    block();
}

這裡的這個值 是死的。所以無論你後面把age改成多少,block都不關心。換句話說:這裡的age是局部變量,出了大括號就死了,所以直接把這個10拿過來,比較安全


我們看一下,被block引用的變量的情況:
block內部能夠一直引用被__block修飾的變量

void test3()
{
    __block int age = 10;
    void (^block)() = ^{
        // block內部能夠一直引用被__block修飾的變量

        NSLog(@"----age=%d", age);
    };

    age = 20;

    block();
}

這裡:block能一直監聽著這個age的值的改變(無論是局部變量還是全局變量),所以這裡打印出來的是age是20
__block修飾的變量,就能保住這個變量的命


這裡我們來看一下,被static修飾的變量,是靜態變量,靜態是永遠在內存中,所以block看到static修飾的這個變量是永遠存在內存中的,那麼block就能每次都能拿到這個變量,所以你age的值的改變。block都能拿到,所以這是動態訪問的,不是把10直接拿過來

void test4()
{
    static int age = 10;
    void (^block)() = ^{
        // block內部能夠一直引用被static修飾的變量
        NSLog(@"----age=%d", age);
    };

    age = 20;

    block();
}

int num = 10;
void test5()
{
    void (^block)() = ^{
        // block內部能夠一直引用全局變量
        NSLog(@"----num=%d", num);
    };

    num = 20;

    block();
}

這裡打印出來的num 是20 。為什麼呢?
因為這裡的num是全局變量,那麼既然是全局變量,就一直在內存中,block就能實時跟新這個值的改變。


總結,那麼我們現在判斷的時候,我們只需要判斷這個變量是不是馬上就銷毀了就行了。但是注意一下__block修飾的變量就行

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved