美文网首页
Block的三种类型(二)

Block的三种类型(二)

作者: 鄂北 | 来源:发表于2021-08-27 17:06 被阅读0次
  • Block的三种类型
    NSGlobalBlock:全局Block
    NSStackBlock:栈Block
    NSMallocBlock:堆Block
    所有的Block最终都继承自NSBlock
1-1.png

从1-1中可以看出三种Block分别存放在数据区域、堆区和栈区

如何区分三种Block

  • 没有捕获auto变量的为NSGlobalBlock
  • 捕获了auto变量的为NSStackBlock
  • NSStackBlock调用了copy的为NSMallocBlock(只有NSStackBlock调用了copy才会变为NSMallocBlock,其他的Block不会)

注意点:

  • 只有NSStackBlock调用了copy才会变为NSMallocBlock,其他的Block不会
  • NSMallocBlock调用了copy还是为NSMallocBlock,但是引用计数+1
  • NSStackBlock由系统控制释放,NSMallocBlock由程序员自己控制,在ARC环境下,程序已经帮我们做了处理,不需要程序员再去释放,在MRC的环境下就需要程序员调用release去释放

在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况

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

怎么查看Block类型
打印[block class]就能知道当前的block类型

Block变量捕获详解(一)
Block对象捕获(三)
__block修饰符(四)
Block循环引用(五)

相关文章

网友评论

      本文标题:Block的三种类型(二)

      本文链接:https://www.haomeiwen.com/subject/pxpmiltx.html