Objective-c Block 面试题

以下是对我们这整段关于 Objective-C 中 Block、__block 修饰符、内存管理行为、生命周期等内容的全面总结,并附带了一套适合面试准备的面试题集(带答案)


🧠 一、知识总结:Objective-C Block + __block 修饰符

✅ Block 的三种类型

Block 类型类名(runtime)存储位置是否捕获变量生命周期
全局 Block__NSGlobalBlock__全局区(.data)❌ 不捕获程序整个生命周期
栈 Block__NSStackBlock__栈上✅ 捕获随函数作用域结束销毁
堆 Block__NSMallocBlock__堆上(copy 后)✅ 捕获ARC/MRC 管理

✅ ARC 与 MRC 的区别

特性ARCMRC
是否自动 copy Block✅ 是(捕获变量会自动 copy 到堆)❌ 否(需手动 copy)
NSAutoreleasePool 可用?❌ 不可用,改用 @autoreleasepool✅ 可以使用
retain/release 是否可用?❌ 禁止✅ 手动管理

__block 修饰符

特性默认变量__block 修饰
是否可在 Block 中修改❌ 否(值捕获)✅ 是(引用捕获)
捕获方式值拷贝(by value)引用封装为结构体
生命周期Block 生命周期内有效Block 生命周期或外部引用共同决定
释放机制不需要释放(副本)自动随 Block 释放;ARC 下自动 retain/release

✅ 修改变量是否需要 __block

操作类型是否需要 __block
修改对象内容(如 addObject:❌ 不需要
修改指针变量本身(如 obj = nil✅ 需要
修改基本类型变量✅ 需要
捕获但不修改变量❌ 不需要

✅ 生命周期补充

捕获变量类型生命周期默认与 Block 相同?可否更长?
基本类型✅ 是❌ 否
对象类型(未被强引用)✅ 是✅ 可被外部引用延长
__block 捕获对象✅ 是✅ 可 retain 延长或造成循环引用

📚 二、面试题集

以下是整理出的 15 道典型面试题(附答案),覆盖基础、陷阱和进阶内容:


✅ 基础题

Q1: Block 有哪三种类型?它们的区别是什么?
🅰️:__NSGlobalBlock__(不捕获变量,放在全局区)、__NSStackBlock__(捕获变量,栈上,临时)、__NSMallocBlock__(捕获变量 + copy 后的堆 Block,生命周期更长)。


Q2: 什么情况下 Block 是 __NSGlobalBlock__
🅰️:当 Block 没有捕获任何外部变量时,它就是 __NSGlobalBlock__,存在全局数据段,程序整个生命周期都有效。


Q3: 在 ARC 和 MRC 下 Block 的默认行为有何不同?
🅰️:

  • ARC:Block 捕获变量时自动拷贝到堆上(自动成为 __NSMallocBlock__
  • MRC:Block 默认在栈上(__NSStackBlock__),需手动 copy。

Q4: 为什么要将 Block 从栈 copy 到堆?
🅰️:因为栈上的 Block 随函数调用结束而销毁,拷贝到堆上可以安全地在异步、延迟或跨作用域中使用。


Q5: ARC 下是否需要手动调用 copy
🅰️:不需要,编译器会自动为你 copy Block 到堆上。


✅ 进阶题

Q6: __block 关键字的作用是什么?
🅰️:允许 Block 修改变量本身(不是对象内部属性),它会将变量封装成一个结构体,以引用方式捕获。


Q7: 为什么修改变量需要 __block
🅰️:因为 Block 默认对基本变量是值拷贝,不允许修改。__block 改为引用方式封装,可被 Block 修改。


Q8: Block 中能修改数组吗?需要 __block 吗?
🅰️:可以修改数组内容,不需要 __block;但如果要让数组指针指向其他对象,则需要 __block


Q9: __block 修饰的对象何时释放?
🅰️:与 Block 生命周期一致,Block 销毁时会释放其引用结构体;对象本身在 ARC 下自动 retain/release。


Q10: Block 会强引用捕获的对象吗?
🅰️:是的,Block 默认会 retain 被捕获的对象 ➜ 导致循环引用风险。


✅ 高阶陷阱题

Q11: Block 内部使用 self 会出现什么问题?如何解决?
🅰️:会强引用 self,导致循环引用。解决方式是用 __weak 修饰 self 的弱引用。


Q12: 在 MRC 中,为什么 NSAutoreleasePool 必须与 autorelease 配合使用?
🅰️:因为 autorelease 注册的对象会在最近的 pool 被 drain 时释放,pool 负责释放“延迟对象”。


Q13: 是否有办法让 Block 捕获的对象比 Block 更长寿命?
🅰️:可以。如果外部对对象有强引用(如全局变量、单例、property strong),对象就会比 Block 活得更久。


Q14: Block 是否可能与 __block 变量形成 retain cycle?
🅰️:是的。例如 obj.block = ^{ NSLog(@"%@", obj); }; 就形成了互相引用,导致内存泄漏。


Q15: 如何破除 Block 的循环引用?
🅰️:使用 __weak__unsafe_unretained 修饰外部对象,避免 Block 内 retain 它。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AndroidMJ-基础-05

基础part5: 9:测试相关 postman genemotion espresso 10:性能相关 profiler 9.测试相关 espresso相关: Android Espresso 自动化测试指南(Java 版)-CSDN博客 10.性能相关 profiler相关: AndroidStudio之内层泄漏工具Profiler…

R语言 | 如何使用R书写html文档?

更灵活的书写方式,可以直接看3. 1. 可用函数 cat()函数writeLines()函数sink()函数重定向输出到HTML文件 小结:cat()适合简单HTML,writeLines()适合多行内容,sink()适合复杂场景。 说明:尽可能不用R包,减…

oracle 表空间超过最大限度,清理数据释放内存

目录 一、扩容:参考 https://blog.csdn.net/weixin_40841731/article/details/134931289 二、清理数据 1、查询文件大小情况(管理员账号) 2、查询表的大小(使用该表空间的用户) 3、清理数据(使用该表空…

初版BL程序一些细节整理(碎碎念)

一.串口的中断触发 一般我们都是使用TXE或者RXNE来触发中断,其实还有完整传输结束的TC标志位和接收完成的IDLE标志位 这两个标志位有些不同,RXNE标志位只需要读取寄存器就会自行清除,但是这两个需要读取两个,拿IDLE举例子 这里需要…

为何京东与蚂蚁集团竞相申请稳定币牌照?

京东与蚂蚁集团竞相申请稳定币牌照,主要是为了抢占数字金融新赛道,结合香港的宽松监管政策与全球稳定币市场的快速增长。香港2023年推出的稳定币监管框架及2025年8月即将实施的《稳定币条例》,为企业提供了合规路径,吸引京东通过币…

[特殊字符] Harmony OS Next里的Web组件:网页加载的全流程掌控手册

🎉 Harmony OS Next里的Web组件:网页加载的全流程掌控手册 ##Harmony OS Next ##Ark Ts ##教育 本文适用于教育科普行业进行学习,有错误之处请指出我会修改。 开发者必看的生命周期回调详解代码实操指南 作为开发者,你可能经常需…

【Java学习笔记】集合介绍

集合 > > 集合的引出 在之前常使用数组存储数据,存在的问题如下: (1)初始化时,长度必须指定,而且一旦指定,不能更改 (2)不方便扩容(使用循环复制原…

电流传感器在汽车中的应用:从BMS电池管理到电机控制的工程解析

1 电流传感器:汽车电子系统的神经末梢 在现代汽车电子架构中,电流传感器已从简单的测量元件演变为​​关键的安全与性能组件​​。作为动力系统的“神经末梢”,它们持续采集电流参数并反馈至控制单元,构成​​实时闭环控制的基础…

积分商城拼团系统框架设计

一、逻辑分析 用户相关逻辑 用户注册与登录:用户需要注册账号才能参与积分商城拼团活动。注册过程中需收集必要信息,如用户名、密码、联系方式等。登录功能则用于验证用户身份,方便用户后续操作。用户积分管理:用户通过各种途径&a…

java 数据结构-HashMap

一、hashmap特点 1、HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 2、HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 3、HashMap 是无序的,即不会记录插入的顺序。 4、HashMa…

DBSyncer:一款开源的数据同步工具

DBSyncer(简称 dbs)是一款开源的实时数据同步中间件,提供 MySQL、Oracle、SQL Server、PostgreSQL、SQLite、Elasticsearch、Kafka、File、SQL 数据库等同步场景;支持上传插件自定义同步转换业务;提供监控全量和增量数…

大型语言模型的中毒攻击的系统评价

大家读完觉得有帮助记得及时关注和点赞!!! 抽象 随着预训练大型语言模型 (LLM) 及其训练数据集的广泛使用,人们对与其使用相关的安全风险的担忧显著增加。 这些安全风险之一是 LLM 中毒攻击的威胁&#xff…

Windows 10更新失败解决方法

前言 在我们使用 Windows 时的时候,很多时候遇到系统更新 重启之后却一直提示“我们无法完成更新,正在撤销更改” 这种情况非常烦人,但其实可以通过修改文件的方法解决,并且正常更新到最新版操作系统 01修改注册表 管理员身份…

Redis高级|Redis单线程VS多线程(基础)

文章目录 面试题Redis为什么选择单线程为什么逐渐加入多线程特性Redis6、Redis7的多线程特性和IO多路复用入门Redis7多线程 面试题 Redis到底是单线程还是多线程?IO多路复用听说过吗?Redis为什么这么快? Redis为什么选择单线程 其实Redis单…

ONLYOFFICE 的AI技巧-1.集成OCR、文本转图像、电子表格集成等新功能

随着人工智能不断革新数字办公空间,我们通过全新的 ONLYOFFICE AI 插件再次实现突破。无论您是长期用户还是新手,这些更新都将让您的文档处理更加智能、直观且高效。让我们一起来了解这些最新增强功能——部分功能已在 ONLYOFFICE 文档 8.3.3 版本中上线…

Snipaste:一款简单强大的跨平台截图工具

给大家介绍一款我在日常写作中使用的截图工具:Snipaste 。它是一个支持截图(Snip)和贴图(Paste)功能的免费软件,支持 Windows、macOS、Linux 跨平台。 智能截图 Snipaste 提供了强大的截图功能&#xff0c…

python学习打卡day52

DAY 52 神经网络调参指南 知识点回顾: 随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业:对于day41的简单cnn,看看是否可以借助调参指南进一步提高精度。 day41的简单CNN最后的结果,今天要做…

自定义线程池 4.0

自定义线程池 4.0 1. 简介 上次我们实现了自定义线程池的 3.1 版本,提供了线程工厂创建线程和工具类创建简单线程池的功能,增强了线程池的灵活性,并且用起来更加方便了,本文我们将做如下的优化: 给线程池添加关闭的…

list is not in GROUPBY clause and contains nonaggregated column ‘*.*‘

SELECT list is not in GROUP BY clause and contains nonaggregated column mydb.t.address which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 关于查询列不在分组字段内触发错误 之前我一直使用其…

Linux vmware image iso qcow2镜像大全

Download Linux VMware Images | Linux VMware Images