对于block的理解及用法的注意


对于block的理解及用法的注意

Block跟swift中的闭包(closure)比较:

基本一样,都常用于值的回调,特别是在多线程网络请求回调中,使用起来极为方便.
Block:格式:
block的开头是"^",接着是由小括号所包起来的参数列,行为主体由大括号包起来.block有四种类型,分别是无参无返回,无参有返回,有参有返回,以及有参无返回.而一般的block是有参block,因为使用block主要就是进行参数的传递.

Block的循环引用问题:
使用block时要特别注意类的循环引用:例如在一个控制器中,self强指针指向一个对象,而这个对象又强指针指向一个block,而在block中,又强指针指向了self,从而导致循环引用,导致内存无法释放,造成内存泄漏.

解决循环引用的方法:
解决循环引用block的方法,常用__weak来打断强引用,例如用__weak来定义一个weakself来指向self的地址,如果self被释放,weakself指向的地址变为nil,从而打断引用环.需要注意的是,__weak是ARC专有的,__unsafe __unretained可以用在ARC 也可以用在MRC,但是__unsadfe __retained是"assign"形式,如果是指向对象被释放,其指针地址保持不变,如果继续使用该指针,就会出现"野指针".
关于block的内存管理:
当block内部没有引用外部变量,block存放在全局区;在MRC下,当block内部引用外部变量,block存放在栈区;当对该栈区的block进行copy操作时,block将存放在堆区.在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区和栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自定回收其内存空间,而堆区一般程序员自行分配释放,若程序员不释放,程序结束时,由系统回收.总的来说,使用栈区更为快捷,而使用堆区更为灵活.

Block使用的注意点:
如果要在block中修改外部变量,当变量是static全局变量时,block可以直接修饰,如果不是,可以使用__block关键字来修饰,就可以在block内修改变量的值.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值