iOS之block
2017-01-13 本文已影响0人
FongG
什么是block?
<b>一句话概括:block是带有自动变量的匿名函数</b>, 与汗水指针类似,我们使用block变量来指向一个block对象
声明--------
返回值类型 (^ block变量名称)(参数)
int (^blockName)(int count);
或者
typedef void(^blockName)(NSError *error);
blockName = ^() (int count){
return count + 1;
}
声明一个blockName变量,由”^“开始的block语法赋值给变量blockName
Stephen Blaha对typedef用法做过一个总结:“建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。
实现-----------
语法:^ 返回值类型 参数列表 表达式
如:
^ int (int count) { return count + 1;}
等价于 ^ (int count) { return count + 1;}
- block表达式会截获使用的自动变量的值,是瞬间的值。
- (void)test{
int a = 10;
void (^block) = {printf(a);} //截获值 a = 10
a += 10;
block();
//打印结果 10
}
- block 中只能访问变量,不能修改,但可以使用__block修饰
如果是在类的block回调中,可以使用self
[UIView animateWithDuration:0.5 animations:^{
self.tableView.alpha = 0.5;
}];
</br>
如果是在类的一个属性,持有了某个block,则block中不能使用self,需要用weak self对象
self.tableView.mj_header = [BaseNormalHeader headerWithRefreshingBlock:^{
weakSelf.tableView.alpha = 0.5;
//调用方法,方法里面可以使用self
[weakSelf updateUI]
}];
-(void)updateInfo{
kWeakSelf
[self.viewModel refreshPerosnInfoMemberId:self.merberID success:^(BaseObjectState *obj) {
weakSelf.tableView.alpha = 1;
}
} faliure:^(NSError *error) {
}];
}
17/12/13 更新
将概念置于情景中处理。
B -> block_B -> block_B -> B
所以归结起来只要切断上面链路中任意一个持有关系,就可以达到避免循环引用的作用