如何避免在Block里用self造成循环引用

简介: 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。

一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。

当一个Block被Copy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者,有两个规则:

  • 如果你是通过引用来访问一个实例变量,那么将强引用至self
  • 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量
苹果官方文档里有两个例子来说明这两种情况:

上面第一种情况相当于用self.xxx来访问实例变量,所以强引用指向了self;第二种情况把实例变量变成了本地临时变量,强引用将直接指向这个本地的临时变量。大多数情况下,我们只用处理第一种情况就行了,因为第二种情况虽然会造成循环引用,但是临时变量很快就被释放了,不会造成真正的循环引用。要避免强引用到self的话,用__weak把self重新引用一下就行了,像这样:
__weak ViewController *weakSelf = self;

目录
相关文章
|
前端开发 JavaScript 定位技术
三、前端高德地图、测量两个点之前的距离
文章介绍了如何在前端使用高德地图API实现测量两个点之间的距离,包括开启和关闭测量工具的方法,以及如何清除地图上的测量点、连线和文字。
706 1
三、前端高德地图、测量两个点之前的距离
|
算法 项目管理
「软件项目管理」一文详解软件项目进度计划
该文章深入讲解了软件项目进度计划的制定方法,包括关键路径法(CPM)的基本概念、ES/LS/EF/LF关系图的绘制、浮动时间的计算以及时间压缩和资源优化技术,并通过实例演示了如何有效管理项目时间。
|
算法 文件存储 计算机视觉
【YOLOv8改进】MobileNetV3替换Backbone (论文笔记+引入代码)
YOLO目标检测专栏探讨了MobileNetV3的创新改进,该模型通过硬件感知的NAS和NetAdapt算法优化,适用于手机CPU。引入的新架构包括反转残差结构和线性瓶颈层,提出高效分割解码器LR-ASPP,提升了移动设备上的分类、检测和分割任务性能。MobileNetV3-Large在ImageNet上准确率提升3.2%,延迟降低20%,COCO检测速度增快25%。MobileNetV3-Small则在保持相近延迟下,准确率提高6.6%。此外,还展示了MobileNetV3_InvertedResidual模块的代码实现。
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解07-阻塞队列之LinkedTransferQueue
`LinkedTransferQueue`是一个基于链表结构的无界并发队列,实现了`TransferQueue`接口,它使用预占模式来协调生产者和消费者的交互。队列中的元素分为数据节点(isData为true)和请求节点(isData为false)。在不同情况下,队列提供四种操作模式:NOW(立即返回,不阻塞),ASYNC(异步,不阻塞,但后续线程可能阻塞),SYNC(同步,阻塞直到匹配),TIMED(超时等待,可能返回)。 `xfer`方法是队列的核心,它处理元素的转移过程。方法内部通过循环和CAS(Compare And Swap)操作来确保线程安全,同时避免锁的使用以提高性能。当找到匹
390 5
|
Java 安全 数据安全/隐私保护
java报错javax.net.ssl.SSLHandshakeException:  sun.security.validator.ValidatorException
linux服务器更新JDK,从jdk1.7升级到jdk1.8,导致java访问https地址时程序报错。                解决方法:1、用浏览器登录该https网站,在浏览器地址栏里找到“证书信息”->“详细信息”->“复制到文件”->选择DER编码二进制X.
11248 0
HMI-42-【节能模式】实现油量表和水温表
今天我来搞一下水温表和油量表。其实就是两个进度条。搞一下。
HMI-42-【节能模式】实现油量表和水温表
|
关系型数据库 MySQL Nacos
Nacos快速安装部署
目录 一、Nacos简介 二、Nacos单机模式部署 1、下载编译后压缩包 2、修改配置文件application.properties 3、执行数据库脚本 4、启动服务器 5、查看启动日志 三、登录Nacos控制台
Nacos快速安装部署
|
存储 Kubernetes 应用服务中间件
K8s不同node如何共享存储&&nfs 搭建(markdown版本)
K8s不同node如何共享存储&&nfs 搭建(markdown版本)
656 0
|
Python
Python 二分法和牛顿迭代法求算术平方根的一点小改进
Python 二分法和牛顿迭代法求算术平方根的一点小改进
253 0

热门文章

最新文章