Block初步理解

(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值