关于Block一些思考

本质

一个block本质上就是一个函数指针,即那个代码快的内存地址;捕获上下文变量的内存块(结构体或者类)

定义

<#returnType#> (^<#blockName#>) (<#parameterTypes#>) = ^ (<#parameters#>) {
<#statements#>
};
returnType : 返回值类型
blockName : block命名
parameterTypes : 参数类型
parameters : 参数

内存管理

  • 在Block中, 如果只使用全局或静态变量或不使用外部变量, 那么Block块的代码会存储在全局区;

  • 使用了外部变量,在ARC中, Block块的代码会存储在堆区;
    在MRC中, Block快的代码会存储在栈区;

  • block默认情况下不能修改外部变量, 只能读取外部变量:

在ARC中, 外部变量存在堆中, 这个变量在Block块内与在Block块外地址相同;外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的堆中;

在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外相同;外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的栈中;

  • 如果需要修改外部变量, 需要在外部变量前面声明 __block

在ARC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同; 外部变量存在栈中, 这个变量会被转移到堆区, 不是复制, 是转移.

在MRC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;外部变量存在栈中, 这个变量在Block块内与Block块外地址相同;

参考

http://www.zhihu.com/question/30779258

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

推荐阅读更多精彩内容