关于block

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时

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容