美文网首页
Block详解

Block详解

作者: Mr_董 | 来源:发表于2016-04-25 10:42 被阅读97次

    一、block的基本

    用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在 {}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):

    block概念.png
    • block最简单形式
      定义格式:void (^block名)() = ^{代码块;}
      使用格式:block名();
      /*定义时,把block当成数据类型
      特点:1. 类型比函数定义多了一个 ^2. 设置数值,有一个 ^,内容是 {} 括起的一段代码
      最简单的定义方式
      void (^myBlock)() = ^ { // 代码实现; }
      /
      void (^myBlock)() = ^ {
      NSLog(@"hello");};
      // 执行时,把block当成函数
      myBlock();
            //1) 无参无返回值的block
            //格式:
            //   -定义block变量
            //   返回值类型  (^block变量名)(形参类型列表);
            
            //   -定义block变量并且赋值
            //   返回值类型 (^block变量名)(形参列表)=^(形参列表){  //代码块 };
            
            //  形式1: void (^block变量名)() = ^(){};
            //  形式2: void (^block变量名)() = ^{};  //省略了小括号
            
        - 例1
            1)无参无返回值的block
            void (^sbblock)();  //定义变量
            void (^sb1)()=^(){
                NSLog(@"哈哈,我来了!");
            };
            
            void (^sb2)()=^{
                NSLog(@"哈哈,我又又有来了来了");
            };
            
            // 执行block
            //格式: block变量名(实参);
    //        sbblock();  //如果只定义,就使用,会报错,因为sbblock没有初始化
            sb1();
            sb2();
            
            
            2)有参数无返回值的block
             形参列表的格式:  数据类型 变量名
            void (^myblock1)(int a);   // 定义一个无返回值有一个参数的block变量,变量名为myblock1
            
            myblock1 = ^(int a){
    
                NSLog(@"a = %d",a);
    
            }; //分号结束
            
            myblock1(438);
            
            //3)有参数\有返回值的block的使用
            // int sum(int a,int b){  return a+b; }
            
            int (^myblock2)(int a,int b)=^(int a,int b){
            
                return a+b;
            };
            
            //执行block并且接收block执行的结果
            int sum = myblock2(20,34);  //返回值
            NSLog(@"sum = %d",sum);
    
    

    2.block的typedef

    • typedef int INT; int 起个别名 INT

    • typedef int ARR[4]; ARR a1; //定义了一个长度为4的整形数组

    • 格式:typedef 返回值类型 (^新别名)(参数类型列表);
      Typedef int(^MyBlock)(int ,int);

      例1)
      //给无参无返回值block变量起别名;
      //格式: void (^新类型名)();

    typedef void (^newType)();
    //用新的类型定义block变量
    newType t1;
    t1 = ^{
    NSLog(@"我是使用newType定义出来的变量t1的值");
    };
    //使用block
    t1();
    

    3.block访问外部变量

    在block内部可以使用外部变量,但是注意,这是一个新的内存空间变量,以const拷贝的方式

    block访问外部.png

    这样,block可以访问外部变量,但是不可以修改

    • 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。这样是直接给变量做了一个从栈区拷贝到堆区的变量,使用的是堆区的变量
    //使用__weak两种
    __weak typeof(TWPhotoCollectionViewCell *) weakCell = cell;
    __weak HEIMController *selfWeak = self;
    

    相关文章

      网友评论

          本文标题:Block详解

          本文链接:https://www.haomeiwen.com/subject/ejvfrttx.html