定义 代码块
变量捕获
循环引用 timer delegate
Block的分类
定义:
-
代码块 就是对一段代码运行的封装
-
可以回调
-
typedef NSInteger(^CalcuteSum)(int a,int b); CalcuteSum sum = ^NSInteger(int a, int b){ NSLog(@"开始计算了%d",a+b); return a + b; }; NSInteger tag = sum(1,10);
变量捕获:
- 局部变量的捕获 值捕获
- 不能修改变量的值
- 如果要修改局部变量的值 需要加上__Block
循环引用:
- vc持有block block持有self.name 变相的是 循环引用
- 解决方案 __weak typeof(self) weakSelf = self 对vc的self 进行弱引用
- 同时在block里面 强引用self __strong typeof(self) strongSelf = weakSelf
block分类:
- globBlock 编译的时候 全局内存中
- mallocBlock 堆block 通过引用计数控制释放
- stackBlock copy到堆block