Block 的定义:
@property (nonatomic,copy)void(^myBlock)(int age);
Block 定义中copy关键字的使用:
1>使用 copy 关键字是把 block 拷贝到堆中,而栈中的 block 的生命周期是和栈绑定的. 使用 copy 是有可能在 block 代码块里面是用到一些本地变量.
2>如果使用 copy属性,当其所在栈被释放的时候,这些本地变量将变得不可访问,一旦代码执行到block这段就会导致bad access;
3>在一个 block 中使用本地变量,如果声名用assign,代码执行到block内部就会出错.
4>在 Objective-C 语言中,一共有 3 种类型的 block:
_NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。
_NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。
_NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。
5>在 block 中对于外部变量的应用:
默认情况下,block 是将外部变量 copy 到其数据结构中来实现访问的,
使用__block 修饰外部变量引用,block 是复制其引用地址来实现访问的.
block循环引用问题:
形成原因:
block引起的内存泄露问题,一般是由于在 block 中使用 self , self 持有当前对象, 当前对象持有 block, block 持有 self. 造成循环引用,
解决办法:
把 block 引用的 self 修饰为弱引用.
__weak viewController* blockSelf = self;