当前位置: 首页 > 工具软件 > OSChina Block > 使用案例 >

Block初步理解

南门嘉
2023-12-01

(1)开发IOS的童鞋们,Block基本天天在用,那用Block有什么好处呢?

block是OC里匿名函数,类似java里的lambda表达式,使用block的话,让我们的代码在一些情况下更简洁,易读,紧凑性更好。

(2)使用block常见的有哪些注意点呢?

  1. 循环引用。

  2. 变量的可变与不可变。

(3)什么是循环引用?

      首先我们要了解Object-c的内存管理,OC使用的是引用计数方式进行内存管理,虽然从mrc转变为arc了,但是本质还是引用计数。如果我们在block里使用了strong修饰的变量的时候,block会持有该对象,而block又被该对象持有,这个时候,当我们检查那个变量的时候发现有人持有,那就不释放,检查block的时候发现block也有人持有,这样的话他们倆都不会被释放,造成内存泄

typedef void(^blk_t)(void);


@interface ViewController ()


@end


@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的话则是进行引用传递(指针,地址等等的叫法),进行引用传递的话,我们就可以修改变量的值了。






转载于:https://my.oschina.net/u/2264711/blog/502005

 类似资料: