Block面试题1 本文主要讲解了Block的概念、变量截获、几种形式,以及在实际开发中需要注意的一些问题。 一、什么是Block? Block是一个将函数及其执行上下文封装起来的对象。通过clang编译命令,我们可以看到Block的内部结构。Block内部封装了函数,因此它同样也有参数和返回值。 二、Block变量截获 Block变量截获分为三种:局部变量截获、局部静态变量截获和全局变量截获。 1. 局部变量截获是值截获。例如,在Block中修改局部变量num的值是无效的,即使编译器会报错。 2. 局部静态变量截获是指针截获。例如,在Block中修改局部静态变量num的值是有效的,即是指针截获。 3. 全局变量、静态全局变量截获:不截获,直接取值。 需要注意的是,如果我们要对Block截获的局部变量进行赋值操作,需添加__block修饰符,而对全局变量、静态变量是不需要添加__block修饰符的。 三、Block的几种形式 Block可以分为全局Block、栈Block和堆Block三种形式。 1. 全局Block存储在已初始化数据(.data)区。 2. 栈Block存储在栈(stack)区。 3. 堆Block存储在堆(heap)区。 在实际开发中,我们经常使用栈Block,而对栈Block进行copy操作,就是堆Block。对全局Block进行copy,仍是全局Block。 需要注意的是,对栈Block进行copy操作,并不代表着栈Block就消失了。左边的malloc是堆Block,右边被copy的仍是栈Block。 另外,__block变量在copy时,由于__forwarding的存在,栈上的__forwarding指针会指向堆上的__forwarding变量,而堆上的__forwarding指针指向其自身。 四、Block的循环引用 使用__block修饰self,并且self持有Block,且Block内部使用到__block修饰的self时,就会造成多循环引用,即self持有Block,Block持有__block变量,而__block变量持有self,造成内存泄漏。 解决这种循环引用可以主动断开__block变量对self的持有,即在Block内部使用完weakself后,将其置为nil。但这种方式有个问题,如果Block一直不被调用,那么循环引用将一直存在。 因此,我们最好还是用__weak来解决循环引用问题。
- 粉丝: 21
- 资源: 304
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python程序设计复习资料
- 高分项目,基于STM32开发的STM32F103RC的电子相册,内含原理图+PCB源文件+程序源码及制作
- YOLOv5深度解析:新一代目标检测算法的突破与应用
- 基于Springboot的小区物业管理系统(有报告) Javaee项目,springboot项目
- 搜索引擎 PHP源码 免费开源
- springboot“闲一品”零食交易平台(源码+lw+ppt+演示视频).rar
- Matlab界面设计-GUI实现动态绘制函数图像
- Matlab数据可视化:在图表中添加数据标签的详细指南
- 基于Springboot的大学生体质测试管理系统(有报告) Javaee项目,springboot项目
- Matlab图像处理大作业-GUI界面实现图像处理
评论0