Block简介
Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理 要么导致return cycle内存泄漏要么内存被提前释放导致crash。 Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。
对于block来说
Block执行的代码,这是在编译的时候已经生成好的;
一个包含Block执行时需要的所有外部变量值的数据结构。 Block将使用到的、作用域附近到的变量的值建立一份快照拷贝到栈上。
block对于外部变量的处理也是有区分的
- 对于简单的不做任何声明的局部变量,block拷贝一份作为常量用于block内部使用。无论外部如何修改局部变量的值。block中相应的参数并不会发生改变。(只读)
- 而对于static修饰的全局变量或者静态变量,变量地址是固定的。block在操作相应的值的时候直接从内存中读取最新的值。
- 还有一种使用__block修饰的变量称之为block变量,实际用法与全局/静态变量一样
总结来说其实对于block
1、只有在使用local变量时,block会复制指针,且强引用指针指向的对象一次。其它如全局变量、static变量、block变量等,block不会拷贝指针,只会强引用指针指向的对象一次。
2、即使标记了为__weak或__unsafe_unretained的local变量。block仍会强引用指针对象一次。