1. 程式人生 > >IOS中 Block用法進階二 區域性變數和全域性變數在Block中的使用

IOS中 Block用法進階二 區域性變數和全域性變數在Block中的使用

一、區域性變數與block塊

先看下面程式碼:

int number=100;
void (^TestBlock)(int)=^(int x){
number=number+x;
};
TestBlock(100);
你會發現 這麼寫編譯器會報錯誤。錯誤截圖如下:


所以,對於一個區域性變數,block裡面這麼做是非法的。也就是說使用可以,想改變沒門!那麼下面加一個修飾 __block (兩個下劃線一個block) 程式碼如下:

    __block int number=100;
    void (^TestBlock)(int)=^(int x){
        number=number+x;
        NSLog(@"TMD 加了一個 __block 修飾下就好了:%d",number);
    };
    TestBlock(100);
發現沒有編譯錯誤 執行下看看唄

2016-05-23 10:32:56.299 NewStyle[965:50227] TMD加了一個 __block修飾下就好了:200

二、全域性變數與block塊

請看下面程式碼:

int value=100;
-(void)testMethod{
    void (^TestBlock)(int)=^(int x){
        value=value+100;
        NSLog(@"看看是不是嘍%d",value+x);
    };
    TestBlock(100);
}
嘿,沒有報錯誤。執行下看看嘍(理論分析:value本身100,首先value加100,接著加上x的值也是100,自然300嘍,看看結果。)

2016-05-23 10:34:18.689 NewStyle[981:51181]看看是不是嘍300

一、static靜態變數與block塊

請看如下程式碼:

    static int number=100;
    int (^TestBlock)(int)=^(int x){
        return number+x;
    };
    NSLog(@"TMD 用static修飾 使用區域性變數的結果:%d",TestBlock(100));
    number=50;//change the value of number.
    NSLog(@"在外面改變number的值,再次呼叫block的結果:%d",TestBlock(100));
執行結果:

2016-05-23 10:35:07.968 NewStyle[995:51910] TMDstatic修飾使用區域性變數的結果:200

2016-05-23 10:35:07.969 NewStyle[995:51910]在外面改變number的值,再次呼叫block的結果:150

有個疑問?static型別  在block裡面可以改變嗎?上面有提到非static的區域性變數在block裡面只能使用不能改變。 試試看。程式碼如下,貌似沒有報編譯錯誤。

    static int number=100;
    void (^TestBlock)(int)=^(int x){
        number=10000;//change the value of  static number without __block.
        NSLog(@"在block塊裡面改變static區域性變數number的值:%d",number+x);
    };
    TestBlock(86);
執行結果如下:

2016-05-23 10:35:07.969 NewStyle[995:51910]block塊裡面改變static區域性變數number的值:10086

到這吧,下一次分享 block高階用法之在兩個控制器之間的傳值以及block中的變數儲存 。