iOS中的block详解

1.block的写法

returnType(^blockName)(parameterTypes) = ^(parameters) {
        statements
    };

returnType 返回值类型,可以为void,不能为空

blockName 名称

parameterTypes 参数类型,可以为void或空

parameters 形式参数,可以为void或空

statements 实现内容

 

2.block的用法

  1. 传值
  2. block做返回值,响应链式编程
  3. block做参数,函数式编程

 

3.内存存储

block在内存中有3种存储形式:

  • _NSContreteStackBlock:栈block,存储于栈中,block内存由系统管理,随时可能被释放,一般在MRC中存在,在ARC中只有并不赋值并且引用外部变量的block是在栈中
  • _NSContreteGlobalBlock:全局block,存储于全局内存中,block不捕获外部变量,作用域在全局,block中可以引用全局变量和静态变量
  • _NSContreteMallocBlock:堆block,存储于堆中,在block中捕获了外部变量、局部变量

注意,初始化只能生成_NSContreteStackBlock和_NSContreteGlobalBlock,_NSContreteMallocBlock是由栈block执行copy操作生成的。在MRC中,block属性一般用copy,这是因为创建的大多为栈block,为了防止系统释放,用copy存储到堆中,可以有效管理,但是在ARC中,由于block的赋值就会自动用copy操作,所以block一般为堆block,在ARC中关键字用copy和strong的效果一致。block作为函数返回值,或者向Cocoa框架含有usingBlock的方法或者GCD的API传递Block参数,也会隐式执行copy操作。

 

 

4.block中的循环引用解决

  • 声明一个__weak类型的对象
  • __block修饰变量,但是需要在block中将对象置为nil
  • block传参数,block传进去的参数为形式参数,就不会引用外部变量
  • 在不需要的时候将block置为nil

 

这边文章只是一个总结,更深入的可以看这两篇,有具体底层的实现,漫谈blockblock详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值