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详解

发布了20 篇原创文章 · 获赞 2 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览