美文网首页
深入理解block的底层之copy

深入理解block的底层之copy

作者: GDCoder | 来源:发表于2021-03-21 12:48 被阅读0次

    由于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

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

    相关文章

      网友评论

          本文标题:深入理解block的底层之copy

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