深入理解block的底层之copy

  • 时间:
  • 浏览:
  • 来源:互联网

由于block涉及的东西稍微多点,所以您看这篇博客之前,最好是看一下我的上一篇博客中,这样更有助于你理解从源码、ARC、MRC带你理解block的三大类型

好,接下来我们继续讨论

block的底层之copy,

首先先看这张图,在我们实际的运用中,我们用得最多的是__NSMallocBlock,因为很多时候,我们都是把block定义在那里,等到想用的时候才去调用,那么说明这种block都是__NSMallocBlock,看图我们知道__NSMallocBlock:就是__NSStackBlock调用了copy.好,这时候我们看上一博客的一个问题,请看下图

ARC环境下运行的

之前我们知道,上面这种写法是__NSStackBlock,在MRC下运行,它也是__NSStackBlock,这个上次的博客讲得非常清楚,那编译器为什么输出__NSMallocBlock?是因为编译器遇到某种情况,它会自动的把__NSStackBlock进行copy操作,进而产生上面的结果!接下来我们就讨论ARC环境下,到底哪些情况会让编译器自动的把__NSStackBlock进行copy操作,转成__NSMallocBlock.

ARC下__NSStackBlock自动转成__NSMallocBlock情况:

1.block作为函数返回值的时候(注意前提这个block还是栈block)

请看下面的代码:

ARC环境下运行

MRC环境为啥非常危险,大家可以自己直接转成MRC环境下,运行一次就知道了.

2.将block赋值给__strong指针的时候

如果不知道什么是__strong指针,请自行了解

请看下面的代码:

ARC环境下运行

这个情况我们用得特别多也是__NSMallocBlock__,如果没有强指针指着,它就是stackblock,那我们也试试吧,请看下面:

ARC环境下运行

这就非常清晰了

3.block作为Cocoa API中方法名含有usingBlock的方法参数时

就是Foundation下,苹果自带的一些方法,比如 数组的遍历enumerateObjectsUsingBlock:这个方法也是传入的是block,所以这个也是__NSMallocBlock__类型

4.block作为GCD API的方法参数时

如下

ARC环境下运行

只要是GCD里面的方法参数是block时,它都是__NSMallocBlock__.

好了,以上就是我说的在ARC情况下,自动会把__NSStackBlock转成__NSMallocBlock__情况,如果你有其它的看法,或者其他的情况,欢迎一起讨论!

因为上面2篇博客我们讨论的auto变量都是基础数据类型,比如int类型,但是我们实际工作中,遇到更多的可能是对象类型,所以接下来的博客,我会介绍遇到对象类型的auto又是什么情况呢?

接下来博客我会介绍Block访问auto是对象类型一些具体情况和使用,来继续探讨block

如果觉得我写得对您有所帮助,请关注我,我会持续更新😄

本文链接http://www.dzjqx.cn/news/show-617551.html