OC-Block

Block在开发过程中是比较常用的技术

Block是什么

Block本质上也是一个OC对象,它内部也有个isa指针
Block是封装了函数调用以及函数调用环境的OC对象

总结:block是封装函数及其上下文OC对象

Block底层结构

Block的变量捕获(capture)

Block类型

类型 描述
__NSGlobalBlock__ 没有访问auto变量
__NSStackBlock__ 访问了auto变量
__NSMallocBlock__ __NSStackBlock__调用了copy

每种类型的Block调用copy后的结果如下所示

Block类型 副本源的配置存储域 复制效果
_NSConcreteStackBlock 从栈拷贝到堆
_NSConcreteGlobalBlock 程序的数据区域 什么也不做
_NSConcreteMallocBlock 引用计数增加

栈上的Block是由系统进行分配和释放的,出了作用域就会被释放,所以需要copy拷贝到堆上。

ARC环境下,编译器哪些情况会从栈区拷贝到堆区

  • block作为函数返回时
  • block赋值给__strong指针时
  • block作为Cocoa API中方法名含有usingBlock的方法参数时
  • block作为GCD API的方法参数时

block是使用copy还是strong的探索

__block

  • __block可以用来修改block内部无法修改auto变量的问题
  • __block不能修饰全局变量、静态变量(static)
  • 编译器会将__block修饰的变量包装成一个对象