Block深层剖析(四)

2021-01-25  本文已影响0人  _桃夭大人_

第一篇文章 Block深层剖析(一)介绍了Block的一些基础概念和用法。
第二篇文章 Block深层剖析(二)分析了最简单的Block源码。
第三篇文章 Block深层剖析(三) 介绍了Block截获的相关特点和__block说明符。
这篇文章将会介绍Block存储域和__block存储域。

通过前面的文章我们知道,Block转换为__main_block_impl_0的结构体类型的自动变量,__block变量转换为__Block_byref_val_0的结构体类型的自动变量。
结构体类型的自动变量 就是在栈上生成的改结构体类型的实例。

1.Block存储域

__main_block_imp_0结构体的成员变量isa的初始化:

impl.isa = &_NSConcreteStackBlock;

说明该Block的类为_NSConcreteStackBlock类。即Block语法生成的Block为_NSConcreteStackBlock类对象,并且设置对象的存储域在栈上。

Block类的copy操作

2.__block存储域

3.__forwarding

__block变量的结构体成员变量__forwarding存在的理由:

这是因为:
当__block变量在栈上时,__forwarding是指向自身本身的指针。

当__block变量复制到堆上时,会将成员变量__forwarding的值替换为 复制目标堆上的__block变量结构体实例的地址。
上一篇 下一篇

猜你喜欢

热点阅读