oc block语法
//定义block int(^block)(int a ,int b ) = ^(int a,int b){ return a>b ? a : b ; }; int d = block(3,4);
block的含意:匿名函数。对比java可以理解为内部类接口实现。
定义模型 :
返回类型(^name)(参数,参数...) = ^(参数,参数...) { do something...};
类型不能省,(^)不能少。参可以没有但要写成(void).实现block时,返回类型不写,跟根据返回值确定。
参数及类型要写。参数必须括号括起。(int a ,,,,)
实例 : //有返回值 int 型
//名字是:block
//参数两个,int a ,int b .必须括起来。C语言函数定义。 int(^block)(int a ,int b ) = ^(int a,int b){ return a>b ? a : b ; };
//返回类型不能加括号。
void(^block)(int a ,int b ) = ^(int a,int b){
a>b ? a : b ; };
block 与变量的关系
- block 与 局部变量的关系
int temp = 100;
void (^block1)(void) = ^(void) {
NSLog(@"%d", temp++);
NSLog(@"%d", temp + 1);
}
调用 block1();
如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?
__block int temp2 = 200;
用__block修饰一下变量, 便在block可以使用了
__block int temp2 = 200;
void (^block9) (void) = ^(void){
temp2++; // 这样就可以修改了!
};
调用 block9();
结果 201; - block与全局变量.
在main函数外定义一个在main函数外定义一个temp3 = 300;
void (^block11) (void) = ^(void){
temp3++;
NSLog(@"temp3 = %d", temp3 + 1);
};
调用 block11();
结果 temp3 = 301;
说明block中可以修改全局变量!
这个跟Java内部类十分的相似。内部类可以对局部变量操作需要声明成final .这里是__block.java 内部类对外部类有引用和copy。具体参考android Hnadler用法。