关于block

2018-02-25  本文已影响0人  此页空白

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时

上一篇 下一篇

猜你喜欢

热点阅读