天天看别人的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\""