block即代码块,将同一逻辑的代码放在一快区域中,使代码更简洁紧凑,易于阅读,而且它比函数使用更方便,代码更美观,因而广受开发者欢迎。block 只是 Objective-C 对闭包的实现,并不是 iOS 独有的概念,在 C++、Java 等语言也有实现闭包,名称不同而已
isa 指向实例对象,表明 block 本身也是一个 Objective-C 对象。block 的三种类型:_NSConcreteStackBlock、_NSConcreteGlobalBlock、_NSConcreteMallocBlock。
应用程序的内存分配:
程序区域.text区
数据区域.data区 _NSConcreteGlobalBlock,复制效果,什么也不做
堆区 _NSConcreteMallocBlock ,复制效果,引用计数增加,并且被block持有
栈区 _NSConcreteStackBlock ,复制效果 从栈拷贝到堆区,并且被block持有
到目前为止,block例子使用的都是_NSConcreteStackBlock类,且都设置在栈上。实际并非全是这样,在记述全局变量的地方使用block语法时,生成的block为_NSConcreteGlobalBlock类对象。
void (^blk)(void) = ^{printf("Global Block\n");};
int main() {
变量作用域结束时,栈上面的__block变量和Block也被废弃,复制到堆上的__block变量和Block在变量作用域结束时不受影响
__block变量用结构体成员变量__forwarding可以实现无论__block变量配置在栈还是堆上都能够正确的访问__block变量.
什么时候block将会从栈拷贝到堆
1,调用block的copy实例方法 2,block作为函数返回值返回 3,将block赋值给附有__strong修饰符id类型或者block类型的成员变量 4,方法名中含有usingBloc的cocoa框架方法或者GCD的api中传递block时
网友评论