IOS中 Block用法進階二 區域性變數和全域性變數在Block中的使用
阿新 • • 發佈:2019-02-19
一、區域性變數與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] TMD用static修飾使用區域性變數的結果: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中的變數儲存 。