關於OC中的block自己的一些理解(一),ocblock理解
一、關於block
1、block的作用:儲存一段代碼。
2、蘋果官方推薦的一種文法,類似於C語言的函數,但是比函數更加靈活。
3、^是block文法的標識。
二、block的用法
1)無傳回值無參數
1 - (void)myFirstBlock 2 { 3 //1.定義block 4 void (^myblock)() = ^{ 5 NSLog(@"無參數無傳回值"); 6 }; 7 //2.調用block 8 myblock(); 9 10 }
輸出結果:
2016-02-18 09:56:50.124 01-block[750:25107] 無參數無傳回值
2)有參數沒有傳回值
- (void)mySecondBlock{ //1.定義block void (^mySecondBlock)(int,int) = ^ (int num1,int num2){ NSLog(@"有參數無傳回值:%d",num1 + num2); }; //2.調用block mySecondBlock(2,3);}
輸出結果:
2016-02-18 10:03:22.221 01-block[811:30160] 有參數無傳回值:5
3)有參數有傳回值
1 - (void)myThirdBlock 2 { 3 //1.定義block 4 double (^myThirdBlock)(double,double) = ^ (double r1,double r2){ 5 return r1 + r2; 6 }; 7 //2.調用block 8 double r3 = myThirdBlock(1.1,2.2); 9 NSLog(@"有參數有傳回值:%f",r3);10 }
輸出結果:
2016-02-18 10:06:42.615 01-block[861:32505] 有參數有傳回值:3.300000
三、block文法的格式
四、block的注意點
1)Block內部可以訪問外部變數;
2)預設情況下,Block內部不能修改外部的局部變數
3)給局部變數加上__block關鍵字,則這個局部變數可以在block內部進行修改
範例程式碼如下:
1 - (void)myFourBlock2 {3 int num = 5;4 void (^myFourBlock)() = ^{5 6 num = 6;7 NSLog(@"%d",num);8 };9 }
如果寫成上面的代碼,Xcode會在第六行“num = 6;”報錯:missing __block type specifier;
修改代碼如下:
- (void)myFourBlock{ __block int num = 5; void (^myFourBlock)() = ^{ num = 6; NSLog(@"%d",num); }; myFourBlock();}
輸出結果:
2016-02-18 10:25:02.195 01-block[1016:45943] 6
代碼虐我千百遍,我待代碼如初戀!