Block是带有自动变量的匿名函数。 匿名函数顾名思义就是不带名字的函数,在C语言中不允许这样的方法存在,而在OC中的Block则可以用指针来直接调用一个函数,但虽说如此我们还是需要知道指针的名称。 自动变量在Block中的具体表现就是截获自动变量,
int b = 0; void (^blo)() = ^{ NSLog(@"Input:b=%d",b); }; b = 3; blo();结果输出0,虽然我们在调用blo之前改变了b的值,但是输出的还是Block编译时候b的值,所以截获瞬间自动变量就是:在Block中会保存变量的值,而不会随变量的值的改变而改变。
int b = 0; void (^blo)() = ^{ b = 3; };上面代码编译出错,编译器提示的大概就是不能在Block中改变变量的值。因为在Block中截获了变量的瞬间值以后就不能再改变变量的值,如果想要在Block中改变变量的值,那么我们只需要在变量声明的时候加上__Block修饰符,像这样:
__block int b = 0; void (^blo)() = ^{ b = 3; };下面这样只是对截获的变量进行操作,而没有进行赋值,是可行的,
NSMutableArray *array = [[NSMutableArray alloc]init]; void (^blo)() = ^{ [array addObject:@"Obj"]; };所以对于截获变量,可以进行操作而不可以进行赋值。但是需要注意的是在Block中不支持对C语言数组进行操作。
//block 定义 ^ NSString *(NSString *a,NSString *b){ return a; }; /* “^”符号表示这是一个Block; NSString *表示返回值。 (NSString a,NSString b)这个括号中是Block的参数,语法和C语言类似。 */ //可以省略Block的返回值,像下面这样写 ^ (NSString *a,NSString *b){ return a; }; //不带参数列表的可以写成下面的形式 ^ { NSLog(@"我没有参数列表"); }; 或 ^void(void) { NSLog(@"我没有参数列表"); };block 声明及赋值:
int (^Blo)(NSString *s1,NSString *s2); Blo = ^(NSString *s1,NSString *s2){ return 1; };声明定义和使用:
typedef void(^Blo)(NSString *s1,UIColor *c); -(void)func:(Blo)BlockPra{ BlockPra(@"Str",[UIColor redColor]); } [self func:^(NSString *s1, UIColor *c) { NSLog(@"%@",s1); self.view.backgroundColor = c; }];