黑马程序员技术交流社区

标题: OC学习笔记10--Block的概念与使用方式 [打印本页]

作者: wowthe1st    时间: 2015-8-3 15:59
标题: OC学习笔记10--Block的概念与使用方式
适合有java与C基础同学迅速了解OC

  1. #import <Foundation/Foundation.h>

  2. // 利用typedef 方便定义Block类型变量
  3. typedef int (^SumBlo)(int,int);
  4. typedef SumBlo (^GetBlo)(SumBlo);

  5. int main()
  6. {
  7.         
  8.         int outA=5,sum;
  9.         //变量声明带上__block表明在Block中可修改该变量
  10.         __block outB=10;
  11.         
  12.         SumBlo sumBlo=^(int a,int b)
  13.         {
  14.                 return a+b;
  15.         };
  16.         
  17.         // 该Block参数为另一个Block类型,返回值也是一个Block类型
  18.         GetBlo getBlo=^(SumBlo sb)
  19.         {
  20.                 //Block内可访问外部局部变量,
  21.                 //但是只能修改以__block声明的外部局部变量
  22.                 outB=sb(outA,outB);
  23.                 return sb;
  24.         }
  25.         
  26.         
  27.         // 通过变量名调用Block,执行Block中的代码段,并获得返回值
  28.         SumBlo sumBlo2=getBlo(sumBlo);
  29.         BOOL b=sumBlo2==sumBlo;
  30.         
  31.         sum=sumBlo2(outA,outB);
  32.         
  33.         NSLog(@"sumBlo2_equals_sumBlo=%d,outA=%d,outB=%d,sum=%d",b,outA,outB,sum);

  34.         return 0;
  35. }
复制代码


Block:
        概念:封装了一段待执行的代码段,该代码段可以有形参和返回值,
                                也可以作为其他函数、方法或Block的参数或返回值,
                                使用Block类型变量调用后执行代码段;
        代码形式:
                                        ^(形参列表)
                                                {
                                                        代码段...
                                                        return XXX;
                                                };
Block类型变量:
                类似指向函数的指针,指向一个Block,
                通过 变量名(参数) 方式执行Block中的代码段;
                声明方式:
                                        返回值类型 (^变量名)(参数类型);
                                例: void (^myBlock)(int,NSString *);
                利用typedef 方便声明:
                                typedef void (^MyBlo)(int,NSString *);
                                MyBlo blo=^(int a,NSString *str)
                                {
                                        .....
                                };
                                
Block代码段中访问外部变量:
        可以访问外部局部变量,
        默认情况无法修改外部局部变量,
        外部局部变量声明中加上 __block 即可在Block中修改;
                                                
                                


作者: 我丶就这样    时间: 2015-8-3 16:31
围观学习!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2