Block介绍
iOS中的block类似于C++的成员函数指针,也类似于JS中的lambada函数,本质上就是一个OC的对象,继承自NSBlock,用于存储函数的上下文以及调用环境。
Block分为三种类型
全局NSConreateGlobalBlock
不访问外部变量的block
栈Block NSConcreateStackBlock
访问外部变量但未进行copy的block为栈block
堆Block NSConcreateMallocBlock
block内的数据修改的时候,需要进行__block修饰的block或者访问外部变量进行copy的block
Block三种修饰符的作用
__block
block默认局部变量是不能进行修改操作的,是只读的这,想要进行修改就需要通过__block去修饰,block体的局部变量默认是值拷贝,跟外部的局部变量内存地址不一样,所以为什么block内的布局变量是可以读的但不能写,通过__block将局部变量生成一个block结构体,将结构体中的forwarding指针指向block体内的对象,从而进行对象的操作。
__weak
常用于解决self强引用block,block强引用self导致循环引用问题,通过__weak对self进行弱引用,从而达到解决循环引用的问题。
__strong
提高安全性,防止被其他线程提前释放。
Block的copy操作
堆block
引用计数器会加1
栈block
从栈内存拷贝到堆内存
全局block
什么也不做