### iOS进阶 - Block底层原理 #### 一、Block的本质 **1. Block作为一个OC对象:** - **ISA指针:** Block本质上是Objective-C中的一个对象,它内部有一个`isa`指针,用于指向Block类的元类,这与普通的OC对象是一致的。 - **封装性:** Block不仅包含了函数体内的代码逻辑,还封装了执行这段代码所需的所有上下文环境,包括但不限于捕获列表、局部变量等。 **2. Block的底层结构:** - **Block的源码转换:** Block在编译过程中并不能直接转换为我们通常所理解的源代码形式,但可以通过使用Clang工具将其转换成可读的C++源代码。具体的转换步骤如下: - 打开终端,使用`cd`命令切换到包含待转换文件的目录。 - 输入命令`clang -rewrite-objc main.m -o main.cpp`来实现转换,其中`main.m`是你想要转换的.m文件,而`main.cpp`是转换后输出的文件。 - 转换完成后,你可以查看输出文件`main.cpp`,了解Block在底层是如何被表示的。 #### 二、Block的变量捕获机制 为了确保Block内部可以正确访问外部的变量,Block设计了一套捕获机制。当Block创建时,会自动捕获其作用域内的所有变量。这些变量会被复制到Block内部的数据结构中,从而保证Block无论在何处执行都能访问到正确的变量状态。 #### 三、Block的类型 Block在Objective-C中有三种主要类型: **1. __NSGlobalBlock__:** - 这种Block通常是在编译器确定Block可以在整个生命周期内都存在于栈上时使用。 - 当调用`copy`方法时,此类Block会被复制到堆上,成为全局Block。 **2. __NSStackBlock__:** - 此类Block最初创建于栈上。 - 当需要将此类Block从栈移动到堆时,例如作为函数返回值或赋值给`__strong`指针时,编译器会自动进行复制。 **3. __NSMallocBlock__:** - 这种Block始终位于堆上。 - 它是通过`malloc`分配空间并初始化的,因此具有更长的生命周期。 #### 四、对象类型的auto变量 当Block内部访问了对象类型的`auto`变量时,其行为取决于Block本身的存在位置。 **1. 如果Block位于栈上:** - 对`auto`变量不产生强引用。 **2. 如果Block被拷贝到堆上:** - 调用Block内部的`copy`函数。 - `copy`函数内部调用`Block_object_assign`函数。 - `Block_object_assign`函数会根据`auto`变量的修饰符(`__strong`、`__weak`、`__unsafe_unretained`)做出相应的操作,例如形成强引用或弱引用。 **3. 如果Block从堆上移除:** - 调用Block内部的`dispose`函数。 - `dispose`函数内部调用`Block_object_dispose`函数。 - `Block_object_dispose`函数会自动释放引用的`auto`变量,类似于`release`操作。 #### 五、__block修饰符 **1. __block的底层原理:** - `__block`修饰符可以用于解决Block内部无法修改`auto`变量的问题。 - 编译器会将`__block`变量包装成一个对象,通过`__forwarding`指针指向该对象自身。 - Block内部有一个特化的指针指向一个特定结构体,该结构体内部的`forwarding`同样指向自身,并且包含了该`__block`变量的实际值。 **2. __block的内存管理:** - 当Block位于栈上时,不会对`__block`变量产生强引用。 - 当Block被复制到堆上时: - 调用Block内部的`copy`函数。 - `copy`函数内部调用`__Block_object_assign`函数。 - `__Block_object_assign`函数会对`__block`变量形成强引用。 - 当Block从堆中移除时: - 调用Block内部的`dispose`函数。 - `dispose`函数内部调用`_Block_object_dispose`函数。 - `_Block_object_dispose`函数会自动释放引用的`_block`变量。 **3. 对象类型的`auto`变量与`__block`变量:** - 当Block位于栈上时,对这两种类型的变量都不会产生强引用。 - 当Block拷贝到堆上时,会通过`copy`函数来处理它们。 通过以上分析,我们可以了解到Block在Objective-C中的底层实现及其与变量管理之间的关系,这对于深入理解Block的工作机制及优化性能至关重要。
- 粉丝: 3
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助