block傳值也適用於從後往前傳值

先介紹block的基本知識

  1. /**
  2. * 1、如何定義一個Block變數
  3. 2、怎樣給定義的Block變數賦初值
  4. 3、如何衝定義Block型別
  5. 4、如何使用Block實現具體的佛那個能
  6. 5、Block與變數作用域的關係
  7. */
  8.  
  9. int sum(int a, int b) {
  10. return a + b;
  11. }
  12.  
  13. int count = ;
  14.  
  15. int main(int argc, const char * argv[]) {
  16.  
  17. /**
  18. * 1、Block是一種資料型別,並且是一種自定義的資料型別
  19. 2、Block的標誌是^(託字元)
  20. 3、Block是匿名函式,TA與函式最主要的區別在於,函式在編譯器就已經知道封裝了什麼功能,但是Block只有當執行時才知道內部封裝的功能,所以說Block更加靈活多變
  21. 4、Block的作用也是封裝程式碼段來實現具體的功能
  22. 5、既然Block是匿名函式,所以賦值時,不能將函式名直接賦值,初值為函式的實現體
  23. */

  24.   // __block修飾基本型別,會將基本型別轉成物件型別,將地址傳入blcok中使用,block內外操作的是同一塊記憶體,如果不加__block修飾,那麼block內外使用的是不同的記憶體
      // __weak不能對基本型別操作
  25. __block int a = ;
  26.  
  27. void (^testBlock)() = ^ {
  28. NSLog(@"%d",a);//Block內部可以訪問區域性變數的值
  29.  
  30. a = ; //Block內部如果想修改外界區域性變數的值,必須對變數進行__block修飾
  31.  
  32. count = ;//Block內部可以直接修改全域性變數的值,也可以直接訪問全域性變數的值
  33. };
  34. testBlock();
  35. NSLog(@"a = %d, count = %d",a, count);
  36.  
  37. int (*p)(int, int) = sum;
  38. typedef int (*P)(int, int);
  39.  
  40. //myBlock是一個有參有返的匿名函式
  41. //myBlock是變數名
  42. //Block型別為 int (^)(int , int),表示此Block為有一個整型返回值,兩個整型引數的匿名函式
  43. //初值為:
  44. // ^(int a, int b) {
  45. // return a + b;
  46. // }
  47.  
  48. /**
  49. * 書寫格式
  50. 1、初值中的返回值型別可以省略不寫,但是必須保證,函式內部返回給外界的值的型別與返回值型別相同
  51. 2、定義Block變數的型別中,引數名可以省略不寫,但是初值中引數名不能不寫,否則無法參與運算
  52. 3、如果Block沒有引數,那麼在初值中表示引數的小括號可以省略不寫
  53. */
  54. typedef int (^MyBlock)(int, int);
  55.  
  56. int (^myBlock)(int, int) = ^(int a, int b) {
  57. return a + b;
  58. };//Blocl實現
  59. NSLog(@"result is %d",myBlock(, ));//Block執行
  60.  
  61. MyBlock subBlock = ^(int a, int b) {
  62. return a - b;
  63. };
  64.  
  65. void (^helloBlock)() = ^ {
  66. NSLog(@"hello world");
  67. };
  68.  
  69. //將字串轉整型
  70. int (^intBlock)(NSString *) = ^(NSString *string) {
  71. return [string intValue];
  72. };
  73.  
  74. NSComparisonResult (^compareBlock)(NSString *, NSString *) = ^(NSString *str1, NSString *str2) {
  75. return [str1 compare:str2];
  76. };
  77.  
  78. NSLog(@"%ld",compareBlock(@"a", @"b"));
  79. helloBlock();
  80. NSLog(@"%d",intBlock(@""));
  81.  
  82. return ;
  83. }