block作为OC中经常使用的代码块,现在在越来越多的地方被使用。她类似于函数,又比函数更灵活。函数在编译前就已经确定了,但是block的代码块确是不确定的,block还有个特点就是可以作为方法的参数被使用,可以跨页面传值,在实际开发中,充当了很多代理的功能。
1.block的定义
第一种:(直接写)
@property (copy) void(^MyBlock)(void);
第二种:(typedef)
typedef void(^MyBlock)(void);
@property (nonatomic, copy) MyBlock block;
常规定义如下
int (^myblock)(int) = ^(int num){
return num * 7;
};
调用的时候
int result = myblock(8);
2.block传参
block不能改变传入block中的参数的值,真正传给block的只是参数的副本
int a = 10; int main(int argc, char * argv[]) { @autoreleasepool { int b = 10; void (^blocktest)(int,int) = ^(int a,int b){ a++; b++; NSLog(@"block a=%d,b=%d",a,b); }; blocktest(a,b); NSLog(@"main a=%d,b=%d",a,b); return 0; } }
打印结果
block a=11,b=11
main a=10,b=10
3.block 的作用域
block可以使用和改变全局变量,而不能使用和改变局部变量,除非在局部变量前加__block修饰
int a = 10; int main(int argc, char * argv[]) { @autoreleasepool { __block int b = 10; void (^blocktest)() = ^(){ a++; b++; NSLog(@"a=%d,b=%d",a,b); }; blocktest(); NSLog(@"a=%d,b=%d",a,b); return 0; } }
打印结果
a=11,b=11
a=11,b=11