Block的介绍
block是将函数及其执行上下文封装起来的对象,block调用就是函数调用
block有三种类型NSGlobalBlock全局block 存储在全局区,NSMallocBlock堆区block,NSStackBlock栈区block
Block的内存管理
block直接存储在全局区,如果block访问外部变量并进行block相应拷贝copy,如果此时block是强引用存在堆区,如果是弱引用存在栈区
Block的循环引用
self强持有block,block内部强持有self
weak-strong-dance , __block 修饰对象, 传递对象self作为block的参数,提供给block内部使用,使用NSProxy子类代替self
截获变量
全局变量 静态全局变量不捕获 直接取值,局部变量是基本数据类型时,捕获值,oc对象时 连同所有权修饰符一起捕获,静态变量时,捕获其指针
__block修饰符
block 无法修改外界普通变量 用__block修饰可以捕获到
__block修饰的变量是一个oc对象 有isa指针 内部的__forwarding指针指向自己
新生成的__block变量在栈区 新创建的block也在栈区,
ARC下系统会把栈block copy到堆区,内部使用的__block变量也复制到堆区,让block强引用这个__block变量,并且让__block变量的forwarding指针指向堆上面的__block变量