- Block和函数很像,具有如下特性:
- 可以保存代码
- 有返回值
- 有形参
- 调用方式一样
- 使用的形式举例:
1)带参数的形参
int (^heblock)(int,int) = ^(int a, int b){
return a + b;
};
2)不带形参的block,如果没有形参可以省略后面的小括号
void (^myblock)() = ^{
NSLog(@“我的BLOCK”);
};
3)利用typedef定义block类型
typedef int (^myblock)(int, int);
myblcok he = ^(int a, int b){
return a + b;
};
int c = he(19,9); // 将19和9的和赋值给c;
- block访问外面的变量
- block内部可以访问外面的变量
- 默认情况下block不能修改外面的局部变量
- 给局部变量加上_block关键字,这个局部变量就可以在block内部修改
如: int a = 11; _block int b = 12;
上面的两个变量a和b只有b能够在block中被修改!
- 在ARC情况下:(用__weak / 下面的方式修饰)
// 在HHLoginViewController.h定义一个完成block
@property (nonatomic, copy) void(^dosomeComplish)();
HHLoginViewController *loginVC = [[HHLoginViewController alloc] init];
//使用__weak避免循环引用
__weak typeof(self) weakSelf = self;
loginVC.dosomeComplish = ^{
[weakSelf dosome];
};
- 在MRC即非ARC情况下:只能用__block