深入理解block的底层之copy

31 篇文章 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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值