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

Block 声明格式:

 

 

int (^personBlock)(int,int)
Block 定义格式
  

  
}

   例: ^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){
    
}

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

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

__block int multiplier = 7;
 int (^myBlock)(int) = ^(int num){
    
}

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



this string  传给  doSomethingWithString  block, 得这么写:


1. invoke-block doSomethingWithString "\"this string\""