block有三种,NSConcreteGlobal,NSConcreteStack,NSConcreteMalloc
1好处:代码紧凑,方便阅读和维护,传值、回调方便,省去很多代理方法(代理模式通过协议 预先定义好代理的行为,从设计模式来说 更加严谨)
2注意事项:
block不能修改外部的局部变量,因为外部局部变量复制到blocck内部,是以const形式复制的。如果要修改,需要在外部的局部变量前加__block,作用就是使外部的局部变量可以进行修改
当block引用外部变量的时候,会对栈区变量进行一次拷贝 到堆区,在block内部操作的是拷贝之后的副本,对外部变量真实的值不会造成影响,
字符串本身就在堆区
3不同的block在内存中的保存位置,
不引用外部的局部变量,保存在全局区
引用外部的局部变量,在ARC下,保存在堆区,MRC下,保存在栈区,因此在定义block属4性的时候,使用copy关键词,将block从栈区复制到堆区,兼顾了MRC
4block循环引用:
使用__weak修饰符,定义一个弱引用
把self临时定义为弱引用 __weak typeof(self) weakSelf = self;
__strong typeof(weakself) strongSelf = weakself;
在block内部不要使用 _成员变量,成员变量默认是由控制器引起的