iOS中block的简单使用及注意点

block是一个匿名函数,也是一个特殊的Objective-C对象。做为Objective-C对象的block是设置在栈上的,属于_NSConcreteStackBlock类。做为属性时,一般使用copy来修饰,将其复制到堆上,栈区的变量是由编译器负责分配和释放的。变量的作用域结束时,栈上的__block变量和block都会被废弃,而复制到堆上的__block变量和block在变量作用域结束时不受影响,可以正常的进行访问,因为__block变量可以通过结构体成员变量__forwarding实现无论是在栈上还是堆上都能够正确的访问。

在OC中,block被分为以下3类:_NSConcreteStackBlock、_NSConcreteGlobalBlock、_NSConcreteMallocBlock。


1.block访问外部变量
在block内部可以访问block的外部变量,但不可修改block外部的变量。
如果直接在block内部修改外部变量时会报错:

使用 __block修饰符修饰block的外部变量后,就可以在block内部修改外部变量:

在block中可以存有超过其变量作用域的被截获对象的自动变量。变量作用域结束时,原来的自动变量被废弃,block中超过变量作用域的存在的变量,将不能通过指针访问原来的自动变量。使用 __block修饰的自动变量,可以在block内部修改,是因为改变了变量的作用域。

2.block使用的循环引用
使用block时要注意由持续循环引用导致内存泄露。造成循环引用的原因是block和self之间相互强引用,self持有block,block持有self。


一般情况下,在使用block的时候,都会使用__weak对self进行修饰来避免出现循环引用的情况:

不是所有使用block的情况都要用__weak来修饰self,只有self直接或者间接使用block时才需要使用__weak修饰self,避免出现循环引用。

UIView动画方法和GCD延时方法中都使用了block,此时并未使用__weak对self进行修饰,也没有造成循环引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值