美文网首页
深入理解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

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

  • Block底层代码

    这里只简单列举block底层用到的部分函数 _Block_copy _Block_byref_copy _Bloc...

  • Block深入浅出 (二)

    这篇文章继续上一篇Block深入浅出 (一)讲解block的存储和copy问题 三 Block的存储和copy...

  • 底层8:block copy

    面试题:__block的作用是什么?有什么使用注意点? 使用__block,编译器会将__block变量包装成为一...

  • Block底层原理分析

    iOSBlock底层原理解析 目录 Block底层解析什么是block?block编译转换结构block实际结构b...

  • Block原理探究(上篇)-Block本质及存储域问题

    主要内容:1.理解Block的本质2.理解Block的存储域分类3.理解Block的Copy原理 一、探究Bloc...

  • iOS底层 - Block 的copy

    本文是通过学习优秀博客的记录整理与理解,然后以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见...

  • iOS当用weak来修饰block时,会发生什么?

    之前验证过copy修饰的block,编译器做了什么。详见文章通过__block的作用深入研究block。与内存有关...

  • iOS高级面试

    1、修饰属性有哪几个?追问 为什么用copy?weak对象为nil的底层原理?2、block是什么?block有几...

  • 深入理解Block之Block的类型

    iOS-Source-Code-Analyse 首发Follow: sunbohong· Github 深入理解B...

网友评论

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

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