iOS Block 知识点拾遗
-
Block为什么要用copy
- block在创建的时候默认分配的内存是在栈上,而不是在堆上。这样的话其本身的作用域是属于创建时候的作用域,一旦在创建的作用域之外调用就会导致程序的崩溃。所以使用了copy将其拷贝到堆内存上。
- block创建在栈上,而block的代码中可能会用到本地的一些变量,在栈上可能随时会被系统释放掉,只有将其拷贝到堆上,才能一直保持Block的存在,并用这些外部变量
-
Block为什么不用retain
- retain只是增加了一次引用计数,block的内存还是在栈上,并没有存在堆上,存在栈上的block可能随时被系统回收
-
为什么进入block中的对象引用计数需要自动加1?
- Block执行的是回调,因此block并不知道其中的对象obj创建后会在什么时候被释放,为了不在block使用obj之前,对象已经被释放,block就retain了obj一次
-
block和函数的关系
- Block的使用很像函数指针,不过与函数最大的不同是Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。
- 函数指针
void(*fun)(int)
- block
void(^fun)(int)
-
block本质(对于block的理解)请查阅Block实现原理
- block实际上是: 指向结构体的指针
- 编译器会将block的内部代码生成对应的函数
-
对于基本数据类型,进入到block中会被当做常量处理。对象 retain 会一次