1.block的写法
returnType(^blockName)(parameterTypes) = ^(parameters) {
statements
};
returnType 返回值类型,可以为void,不能为空
blockName 名称
parameterTypes 参数类型,可以为void或空
parameters 形式参数,可以为void或空
statements 实现内容
2.block的用法
- 传值
- block做返回值,响应链式编程
- 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