A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 泥娃娃 中级黑马   /  2016-3-18 16:57  /  702 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 泥娃娃 于 2016-3-18 17:00 编辑

block的简单用法
1,block的基本用法:
    1) block最简单形式 :
        定义格式:
            void (^block名)() = ^{代码块;}
        使用格式:
            block名();
        例如:
            定义一个block:
                void (^myBlock)() = ^ {
                    NSLog(@"hello");
                };
            调用block:
                myBlock();
    2),带有参数的block的定义和使用:
        定义格式:
            void (^block名称)(参数列表)
                = ^ (参数列表) { // 代码实现; }
        例如:
            //定义有参数的block
            void (^sumBlock)(int, int) = ^ (int x, int y) {
                 NSLog(@"%d", x + y);
             };
             //调用block
             sumBlock(10, 20);
    3),带有参数和返回值的block
        定义格式:
               返回类型 (^block名称)(参数列表)
                  = ^ 返回类型 (参数列表) { // 代码实现; }
         例如:
              //定义有返回值和参数的block
               int (^sumBlock2)(int, int) = ^ int (int a, int b) {
                     return a + b;
                };
              //调用有返回值的block
                NSLog(@"%d", sumBlock2(4, 8));
                     
typedef 在block中的使用:
     1,函数指针回顾:
          typedef int (*NewType)(int x,int y);
          NewType f1,f2,f3; //f1实际类型 int (*f1)(int x,int y);
       2,block的typedef
          格式:
             typedef  返回值类型 (^block变量名)(参数类型列表);
          例如:
             typedef void (^newType)();
             //用新的类型定义block变量
              newType t1;
              t1 = ^{
                    NSLog(@"我是使用newType定义出来的变量t1的值");
                };
            //使用block
              t1();
        
block访问外部变量:
       1,在block内部可以访问block外部的局部变量;当定义block的时候,block会把外部变量以const的方式复制一份,存放到block的所在的内存中.
                void test(){
                    int m = 10;
                    void (^myBlock)()=^{
                        //block会把外部变量m 以const的方式复制一份,到自己的内存中,并且不能修改
                        };
                 }
      2,默认情况下,block内部不能修改外部的局部变量;如果非要修改,给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
                      void test(){
                          __block int m = 10;
                          void (^myBlock)()=^{
                              //如果非要在这里修改m的值,需要给m加上__block关键字
                              m = 100;
                              //这样可以理解为,block不在以const的方式拷贝m的变量到自己的内存中
                          };
                      }
         3,如果在block中将m的值改变了之后,后面在使用m的时候,使用的都是block中的m;

block作为函数的返回值;
                1,使用typedef定义一个新的类型;
                      typedef int(^newType2)(int ,int );
                2, 用新定义的类型作为函数的返回值
                      newType2 test2(){
                          //返回一个特殊的"值" 这个值是一个有返回值,有两个参数的的代码块
                          return ^(int a,int b){
                              return  a+b;
                          };
                      }
               3,定义block变量接收 函数返回的结果
                       newType2 n2 = test2();
                4,执行block
                      int s =  n2(23,12);
                      NSLog(@"s = %d",s);
                     
block的使用技巧:
   1,inlineBlock  block助记符;
   2,自定义代码块;
   3,声明标准的block代码;

block的应用
  1. #import
  2. //void (^workBlock)()
  3. // block类型的变量 workBlock
  4. // 作为函数的参数
  5. void work(void (^workBlock)()){//int a
  6.     NSLog(@"起床");
  7.     NSLog(@"刷牙");
  8.     NSLog(@"去车站");
  9.     NSLog(@"坐车");
  10. //    NSLog(@"了解项目"); //思考: 把这句话作为参数传递过来
  11.     workBlock();
  12.     NSLog(@"去车站");
  13.     NSLog(@"坐车回家");
  14.     NSLog(@"吃饭");
  15.     NSLog(@"睡觉");
  16. }
  17. //每天做什么事情
  18. void workDay(int n){
  19. // 定义别名
  20.     typedef void (^workBlock) ();
  21.     workBlock w;  //w是变量
  22.       switch(n) {
  23.         case 1:
  24.             w =^{
  25.                 NSLog(@"----->了解项目");
  26.             };
  27.             break;
  28.         case2:
  29.             w = ^{
  30.                 NSLog(@"----->分析项目");
  31.             };
  32.             break;
  33.         case3:
  34.             w = ^{
  35.                 NSLog(@"----->写项目");
  36.              };
  37.             break;
  38.         case4:
  39.             w = ^{
  40.                 NSLog(@"----->调试项目");
  41.              };
  42.             break;
  43.         case 5:
  44.             w = ^{
  45.                 NSLog(@"----->离职");
  46.              };
  47.             break;
  48.          default:
  49.             break;
  50.     }
  51.    //调用work函数
  52.     work(w);
  53. }
  54. //void day1(){
  55. //     NSLog(@"起床");
  56. //     NSLog(@"刷牙");
  57. //     NSLog(@"去车站");
  58. //     NSLog(@"坐车");   
  59. //     NSLog(@"了解项目");   
  60. //     NSLog(@"去车站");
  61. //     NSLog(@"坐车回家");
  62. //     NSLog(@"吃饭");
  63. //     NSLog(@"睡觉");
  64. //}
  65. //void day2(){   
  66. //    NSLog(@"起床");
  67. //    NSLog(@"刷牙");
  68. //    NSLog(@"去车站");
  69. //    NSLog(@"坐车");   
  70. //    NSLog(@"分析项目");   
  71. //    NSLog(@"去车站");
  72. //    NSLog(@"坐车回家");
  73. //    NSLog(@"吃饭");
  74. //    NSLog(@"睡觉");
  75. //}
  76. //void day3(){   
  77. //    NSLog(@"起床");
  78. //    NSLog(@"刷牙");
  79. //    NSLog(@"去车站");
  80. //    NSLog(@"坐车");   
  81. //    NSLog(@"写代码");   
  82. //    NSLog(@"去车站");
  83. //    NSLog(@"坐车回家");
  84. //    NSLog(@"吃饭");
  85. //    NSLog(@"睡觉");
  86. //}
  87. //void day4(){   
  88. //    NSLog(@"起床");
  89. //    NSLog(@"刷牙");
  90. //    NSLog(@"去车站");
  91. //    NSLog(@"坐车");   
  92. //    NSLog(@"调试程序");   
  93. //    NSLog(@"去车站");
  94. //    NSLog(@"坐车回家");
  95. //    NSLog(@"吃饭");
  96. //    NSLog(@"睡觉");
  97. //}
  98. //void day5(){  
  99. //    NSLog(@"起床");
  100. //    NSLog(@"刷牙");
  101. //    NSLog(@"去车站");
  102. //    NSLog(@"坐车");   
  103. //    NSLog(@"离职");   
  104. //    NSLog(@"去车站");
  105. //    NSLog(@"坐车回家");
  106. //    NSLog(@"吃饭");
  107. //    NSLog(@"睡觉");
  108. //}
  109. intmain(intargc, constchar* argv[]) {
  110.     @autoreleasepool {        
  111. //        day1();
  112. //        day2();
  113. //        day3();
  114. //        day4();
  115. //        day5();
  116.         for (int i=1; i<=5; i++) {
  117.             workDay(i);
  118.         }
  119.     }
  120.     return 0;
  121. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马