IOS block学习笔记

天天看别人的block,各种羡慕嫉妒恨。狠下心来 自己也玩玩block,看看这水深不深。

Block 声明格式:

    return_type (^block_name)(param_type,param_type,,……)

    例:

           int (^personBlock)(int,int)

Block 定义格式

    ^return_type (param_type param_name,param_type param_name,……){

  ~~~~

    return return_type;

}

     例: ^int(int num1,int num2){return num1+num2;}

 

Block 还有另外一种不同的定义方法。 以 ^ 符号起始,后面跟随着参数,这里的参数必须有参数名, 还必须和它要赋值到的 Block 声明中参数列表里面的参数类型和顺序相匹配。下面是实际的代码。

示例:^(int num1,int num2){return num1+num2;}

声明和定义结合起来就是 苹果官方的例子:

 int multiplier = 7;

 int (^myBlock)(int) = ^(int num){

      return num*multiplier;

}

此时 multiplier的值是不可变的,如果想在 block里对 multiplier进行改变,则需要 前面加上 __block (两个下划线)

   __block int multiplier = 7;

  int (^myBlock)(int) = ^(int num){

      return num*(++multiplier);

}

 

Block 本身的调用方法 与 函数的调用方法基本类似 例 int result= myBlock(4);

Block 可以直接作为参数传递,就像一个内联函数 

           qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {

                char *left = *(char **)l;   

                char *right = *(char **)r;  

                return strncmp(left, right, 1);  

            });

调试:

你可以在blocks中设断点并单步跟踪. 你也可以在GDB里直接用 invoke-block命令调用blocks,如下所示:

  1. $ invoke-block myBlock 10 20  
如果要传递C的字符串,你必须用引用括起来, 比如把 this string 传给 doSomethingWithString block, 得这么写:
  1. $ invoke-block doSomethingWithString "\"this string\""  

 

 

 

原文地址:https://www.cnblogs.com/superhappy/p/3022151.html