swift 通知_Swift 闭包无脑加 [weak self] 行不行?

本文探讨了Swift中闭包的内存管理问题,特别是是否在所有闭包中都需要使用[weak self]。通过实例分析,解释了非逃逸闭包与逃逸闭包的区别,以及它们对循环引用的影响。结论指出,是否使用[weak self]应根据闭包是否可能导致内存泄漏以及业务需求来判断,盲目添加可能导致反效果。
摘要由CSDN通过智能技术生成

e64480714f95af0db13287ec76530d75.png

用到 Swift 的闭包的时候,我们经常会加 [weak self]

但你有没有问过自己,它是不是非加不可?

比如这个场景:

class YourViewController {
    
    override func viewDidLoad() {
    
        super.viewDidLoad()
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
      // [weak self] in
            print(self)
        }
        dismiss(animated: true)
    }
}

假如我们 present 这个控制器,它将在 viewDidLoad() 中被 dismiss,也就是说它还没完全出现的时候就会被关闭。

那么这里的asyncAfter,即 2 秒钟之后执行print(self),这个闭包有没有必要加[weak self]


循环引用?

首先的首先,关于闭包引起的循环引用,官方是这样介绍的:

Strong Reference Cycles for Closures - The Swift Programming Language​docs.swift.org
912a7f93b5b3903b037df861768191a0.png

一问 [weak self] 的用途,估计很多人都会说“避免循环引用”。那么此处有没有循环引用呢?

如果你的答案是“当然没有”,你可以直接看下一节。

asyncAfter 这段代码等价于:

let closure = {
     print(self) }
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: closure)
dismiss(animated: true)

如果此处有循环引用,那我们讨论的应该是 closure

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值