(1)开发IOS的童鞋们,Block基本天天在用,那用Block有什么好处呢?
block是OC里匿名函数,类似java里的lambda表达式,使用block的话,让我们的代码在一些情况下更简洁,易读,紧凑性更好。
(2)使用block常见的有哪些注意点呢?
循环引用。
变量的可变与不可变。
(3)什么是循环引用?
首先我们要了解Object-c的内存管理,OC使用的是引用计数方式进行内存管理,虽然从mrc转变为arc了,但是本质还是引用计数。如果我们在block里使用了strong修饰的变量的时候,block会持有该对象,而block又被该对象持有,这个时候,当我们检查那个变量的时候发现有人持有,那就不释放,检查block的时候发现block也有人持有,这样的话他们倆都不会被释放,造成内存泄
typedef void(^blk_t)(void);
@interface ViewController ()
@implementation ViewController{
blk_t _blk;
}
- (void)viewDidLoad {
[super viewDidLoad];
_blk = ^{
NSLog(@"self=%@",self);
};
}
这个代码就会造成循环引用,目前xcode也会直接提示你这里出现循环引用,所以一般这种错误不会犯。
现在避免循环使用的主要两种方式,一种是weak,一种是__block 使用后赋值nil
(4)如果要对block中使用的变量进行赋值的话,为什么要加__block呢?
这个要从block的实现去理解,我们知道OC最后还是转成C(C++)执行的,使用clang命令,简单查看下有没加__block代码转换后的区别。
如果没有加__block的话进行值传递,(block里定义了外面传进来对应的变量),值传递的话我们就无法获取到这个变量改变后的值,也不能修改这个变量的值。
加了__block的话则是进行引用传递(指针,地址等等的叫法),进行引用传递的话,我们就可以修改变量的值了。