Block面试题详解:值/指针截获与不同变量类型

需积分: 0 0 下载量 98 浏览量 更新于2024-08-05 收藏 535KB PDF 举报
Block是Objective-C中的一种高级特性,它是一种内联的代码块,能够将函数和其执行上下文封装在一个对象中。在面试中,关于Block的知识点通常会涉及以下几个方面: 1. **Block的本质与结构**: Block本质上是Objective-C对象,包含一个isa指针,指向`__block_impl`结构体,该结构体定义了block的属性和实现细节。内部的函数和执行上下文被封装在`block_copy`和`block_release`机制中,提供了一种轻量级的函数调用方式。 2. **Block变量的截获方式**: - **局部变量截获**:值截获,意味着block存储的是局部变量的副本,而非变量本身。修改局部变量不会影响block中的值,反之亦然,除非使用`__block`修饰局部变量。 - **局部静态变量截获**:指针截获,block捕获的是局部静态变量的地址,因此在block内部修改该变量是有效的。 - **全局变量、静态全局变量和__block修饰的变量**:不进行截获,而是直接读取变量的当前值。全局变量无需`__block`修饰,静态全局变量也是如此。 3. **Block的形式**: - **栈Block** (_NSConcreteStackBlock):由编译器自动管理内存,生命周期与函数调用紧密相关,当函数返回时会被销毁。 - **堆Block** (_NSConcreteMallocBlock):由程序员手动分配内存,生命周期更长,但可能导致内存泄漏。 - **全局Block** (_NSConcreteGlobalBlock):存储在程序的全局空间,直到程序结束。 4. **Block的内存管理和使用注意事项**: - 对于需要在block中持久保存局部变量值的情况,应使用`__block`修饰,这样可以确保变量在block生存期内可用。 - 自动引用计数(ARC)下,局部变量的值截获不会导致循环引用,但如果需要在block结束后保持变量存在,应显式地弱引用。 掌握这些知识点对于理解和使用Block在iOS开发中的功能至关重要,尤其是在处理线程同步、回调、事件处理等方面。面试时,熟悉这些概念的细节和实际应用场景有助于展现你的技术实力。