Swift 5.7:使用`guard let self`是否安全无问题?
这种写法不会产生循环引用
你现在用的Swift 5.7+简写语法,和之前的写法本质完全等价,不存在额外的循环引用风险,原因如下:
- 闭包开头的
[weak self]已经把self以弱引用的方式捕获了,这是避免循环引用的核心前提,两种写法都遵守了这个规则。 guard let self else { return }是Swift 5.7引入的可选绑定简写,等价于旧写法里的guard let weakSelf = self else { return }——它只是在闭包内部的局部作用域里,把弱引用的self临时提升为强引用,这个强引用仅在guard之后的代码块内有效,闭包本身捕获的依然是弱引用。- 循环引用的本质是两个对象互相持有强引用,这里闭包并没有持有
self的持久强引用,只是在执行时临时强引用,执行完毕后这个强引用就会释放,完全不会形成循环。
对比两种写法:
- 旧写法需要额外定义
weakSelf变量,代码冗余; - 新写法直接复用
self名称,更简洁易读,同时保留了原有的内存安全特性,是官方推荐的简化写法。
内容的提问来源于stack exchange,提问作者JamesDerrick248
相关产品推荐
相关产品推荐

