iOS Block

Block介绍

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

Block的三种类型

  • _NSConcreteStackBlock:全局数据区的 Block 对象,在栈上创建。
  • _NSConcreteMallocBlock:在堆上创建的 Block 对象
  • _NSConcreteGlobalBlock:全局数据区的 Block 对象

对三种Block对象分别进行copy的结果为

  • __NSGlobalBlock __ 调用 copy 操作后,什么也不做
  • __NSMallocBlock __ 调用 copy 操作后,复制效果是:引用计数增加;副本存储位置是堆
  • _NSStackBlock __ 调用 copy 操作后,复制效果是:从栈复制到堆;副本存储位置是堆

Block的类型如何界定?

NSGlobalBlock界定方法

  • 不捕获全局变量(包括全局静态变量)
  • 没有捕获变量或者捕获的只有局部静态变量
  • 以指针形式截获局部静态变量

NSStackBlock
访问了外部变量,但没有强引用指向这个block

NSMallocBlock
访问了外部变量而且有强引用指向该block(或者作为函数返回值)就会自动将__NSStackBlock类型copy到堆上

你可能感兴趣的:(iOS Block)