码迷,mamicode.com
首页 > 其他好文 > 详细

block

时间:2015-10-01 12:55:24      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:存储   代码   

block类型的变量的声明

  • 虽然block类型的变量是用来存储1断代码的.

    • 但是1个block类型的变量并不是任意的代码段都可以存储的 而是有限定的.

    • 在声明block变量的时候,必须要指定这个block变量存储的代码的返回值类型是什么,参数是什么.

      • 一旦指定. 那么这个block变量中就只能存储这种类型的代码段.
  • . 在声明block变量的时候,必须要指定这个block可以存储的代码段的返回值类型和参数.

    • 声明block变量的语法:

      • 返回值类型 (^block变量名)(参数列表);
void (^myBlock)();
  • 表示声明了1个block类型的变量 变量名叫做myBlock
    • 这个myBlock变量只能存储无返回值无参数的代码段.
void (^myBlock1)(int num1,int num2);
  • 表示声明了1个block类型的变量叫做myBlock1
    • 这个myBlock1变量之中可以存储无返回值 带两个int类型的参数的代码段.
 int (^myBlock2)(int num1,int num2);
  • . 虽然语法看起来相当怪异,但是这是固定的.

    • block变量在声明的时候 要指定这个变量存储的代码段的返回值 和 参数

      返回值类型 (^block变量名)(参数列表);

block变量的初始化

  • . 为block类型的变量赋值很简单. 只需要将符合要求的代码段赋值给block变量.

    • 我们的代码段的返回值和参数要和block变量的要求一致.
  • . 如何写1个符合要求的代码段.

    • 语法:
      ^返回值类型(参数列表){
      代码;
      };

      • 无参数无返回值的代码段.
^void(){
            NSLog(@"呵呵1");
            NSLog(@"随便2");
        };
  • 完全可以将这个代码段通过赋值符号存储到符合要求的block变量之中.
 void (^myBlock1)();
        myBlock1 =   ^void(){
            NSLog(@"呵呵1");
            NSLog(@"随便2");
        };
  • 当然完全可以在声明block变量的同时直接赋值.

    • 无返回值,有参数的代码段的书写.
^void(int num1,int num2){
                int num3 = nim1 + num2;
                NSLog(@"num3 = %d",num3);
           };
void (^myBlock2)(int num1,int num2) =  ^void(int num1,int num2){
            int num3 = nim1 + num2;
            NSLog(@"num3 = %d",num3);
        };
  • 有返回值 有参数的代码段的书写.
^int(int num1,int num2){
                int num3 = num1 + num2;
                return num3;
           };
int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){
            int num3 = num1 + num2;
            return num3;
        };
  • 为block变量赋值代码段的时候,代码段必须符合block变量的返回值和参数的要求.
    • 否则就会报错.

执行存储在block类型变量中的代码

  • . block变量中存储的是1段符合要求的代码.

    • 我们可以执行存储在block变量中的代码.

  • . 如何执行?

    • block变量名();

    • 如果存储在block变量中的代码段有参数,那么给参数就可以了.

    • 如果有返回值,使用1个相应类型的变量接收返回值就可以了.

使用block注意小点

  • . 如果代码段没有参数. 那么代码段可以省略表示参数列表的小括弧.
 void (^myBlock)() = ^void{
            NSLog(@"呵呵");
        };
  • . 如果声明block变量的时候,要求代码块带参数. 那么在声明block变量的时候.
    • 可以只写参数类型,省略参数名称.
    • 但是代码段是必须要写参数名字的.
void (^myBlock)(int,int) = ^void(int num1,int num2){
            NSLog(@"%d + %d = %d",num1,num2,num1+num2);
        };
  • . 代码段的返回值类型可以省略.
 int (^myBlock)(int,int) = ^(int num1,int num2){
            return num1 + num2;
        };
  • 如果代码段没有指定返回类型. 那么这个代码段的返回值类型就是return回去的数据的类型.
    • 如果没有return 那么这个代码段就的返回值就是void.
void (^block1)() = ^{
            .....
        };

使用typedef将复杂的block定义简化

  • .遇到的问题.

    • 如果我们希望定义1个无返回值无参数的block变量.
      • void (^myBlock1)();
      • 如果再希望定义1个呢?
      • void (^myBlock2)();
      • 如果再希望定义1个呢?
      • void (^myBlock2)();
        ………..
    • 你有没有发现,每次定义block变量要使用好长的1段代码,忒麻烦.

  • .我们学习过typedef 给已经存在的类型取1个别名.

    • 我们可以为1个指定要求的block取1个短别名. 然后使用这个别名声明多个要求一致的block变量.
typedef void (^newType)();
  • 代表为返回值为void 并且没有参数的block类型 定义了1个别名叫做newType.
    • 如果我们想声明1个没有返回值并且参数的block.直接使用别名newType就可以定义.
    • 比如:
newType myBlock;
  • 首先,myBlock是1个变量.1个block类型的变量.这个变量要求存储的代码段无返回值并且没有参数.

    • 所以,可以像下面这样初始化.
myBlock = ^{
        NSLog(@"呵呵");
    };
  • 调用按原来的就方式就可以调用.
 myBlock();

举例

typedef int (^newType)(int,int);
  • 代表为返回值为int类型,参数有两个int类型的参数的block类型 定义了1个别名叫做newType.

    • 如果我们要声明1个返回值为int,并且参数是两个int类型的block变量的时候,
    • 就可以使用newType来直接简单声明
newType sumBlock = ^(int num1,int num2){
        return num1 + num2;
    };
  • 调用block
int sum = sumBlock(10,20);

block访问外部变量

  • . 默认情况下,block内部可以取外部的变量的值.

    • 但是无法修改外部变量的值.
    • 可以修改全局变量,但是无法修改外部的局部变量.

      • . 如果允许外部变量的值在block内部可以被修改,那么就将外部变量使用__block修饰.

版权声明:本文为博主原创文章,未经博主允许不得转载。

block

标签:存储   代码   

原文地址:http://blog.csdn.net/yi_zz32/article/details/48845017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!