Block 语法:
作为当地变量:
returnType (^blockName)(parameterTypes) = ^returnType(parameters) { ... ... }
作为属性:
@property (nonatomic,copy) returnType (^blockName)(parameterTypes)
作为方法参数:
-(void)someMethodThatTakesABlock:( returnType (^)(parameterTypes) )blockName
作为方法调用的参数:
[someObject someMethodThatTakesABlock:^returnType(parameters){ ... ... } ];
作为typeDef:
typedef returnType(^typeName)(parameterTypes)
TypeName blockName = ^returnType(parameters) { ... ... };
Block算是一个对象
BLock对变量的捕获规则
1 静态存储区的变量,例如全局变量,方法中的static变量,
可引用可修改
2 block接受的参数
传值,可修改,和一般函数的参数相同
3 栈变量:(被捕获的上下文变量)
const,不可修改,当block被copy后,block会对ID类型的变量产生弱引用,每次执行block 时捕获到的变量都是最初的值
4 栈变量(有block 前缀)
引用,可修改。如果是id类型则不会被block retain, 必须手动处理其内存管理
如果是C类型变量,blcok 被copy到heap后,改值也会被挪动到heap
内存:
Block_copy()和Block_release()必须匹配
_block修饰词会将原本简单类型转化为较大的struct,给内存调用带来额外的开销
循环引用:block 被copy之后,该block会对他捕获到的对象产生Strong引用,如果self引用的block,block捕获了self,将会造成内存循环,解决方法
如果捕获到的是当前变量的成员变量,也会造成对self 的引用,同样会造成内存循环
Block是个对象,他对他所捕获到的值都进行强引用(strong)
网友评论