深入理解Block:面试重点解析

需积分: 5 0 下载量 148 浏览量 更新于2024-08-05 收藏 565KB PDF 举报
"Block面试题.pdf - 包含iOS Block相关知识,包括Block的定义、变量截获机制以及Block的三种形式" 在iOS开发中,Block是一种强大的编程工具,它允许我们将代码块作为对象来处理,这使得它可以作为参数传递、存储在变量中或者用作回调。Block的主要知识点如下: 1. **Block的定义** Block 是一种闭包,能够捕获和存储其定义时的作用域内的变量值,同时它也具备函数的特性,拥有参数和返回值。在Objective-C中,Block被编译为结构体,包含一个`__block_impl`结构体,这个结构体内有一个`isa`指针,表明Block本质上是一个Objective-C对象。 2. **Block变量截获** - **局部变量**:Block会按值截获局部变量,也就是说,如果在Block内部访问局部变量,实际上是访问的该变量的一个副本。例如,如果在Block内部修改这个变量,对外部变量无影响,甚至可能会导致编译错误。 - **局部静态变量**:Block会按指针截获局部静态变量,因此在Block内部对变量的修改会影响到外部的变量。 - **全局变量和静态全局变量**:Block不会截获这些变量,而是直接使用它们的当前值。不需要`__block`修饰符。 - **__block修饰符**:用于使变量可以在Block内部被修改,它会创建一个新的结构体对象,该对象有一个属性指向被修饰的变量,使得Block内部的修改可以影响到外部变量。 3. **Block的内存管理** - **全局Block(_NSConcreteGlobalBlock)**:存储在数据段中,生命周期与程序相同,无需关心内存管理。 - **栈Block(_NSConcreteStackBlock)**:存储在栈上,当Block离开作用域时会被自动销毁。如果Block引用了外部变量,尤其是强引用了`self`,可能导致循环引用,此时需要拷贝Block到堆上避免问题。 - **堆Block(_NSConcreteMallocBlock)**:当Block被赋值给一个强引用(如全局变量、实例变量或属性)时,Block会被复制到堆上,需要手动管理内存。 4. **Block中的self和成员变量** 在Block内部,访问`self`或类的成员变量时,Block会捕获`self`的引用,可能导致循环引用。为了避免这种问题,通常推荐使用弱引用`__weak`来引用`self`,或者在Block内部使用弱引用来访问成员变量。 理解并熟练掌握Block的这些知识点对于iOS开发来说至关重要,因为Block在很多场景下都起到了关键作用,比如GCD的异步执行、回调处理等。正确地使用Block可以提升代码的可读性和可维护性,同时避免内存管理上的问题。在面试中,了解这些知识也能展示出开发者对Objective-C和iOS开发深入的理解。