iOS 中 weak self 和 unowned self 的区别是什么?

点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识

前言

在 OC 时代我们经常用到 weak self,主要为了解决循环引用,但在 swift 中,还有另外一个类似功能的关键字 unowned self

weak self 大家已经用得很熟练了,但是 unowned self 肯定还有人没用过,今天就来讲讲这个两个的区别。

weak self

weak self 表示对 self 的弱引用,即不保持对 self 的强引用。在闭包中访问 self 是一个可选类型,你需要在使用它时进行解包,如果在闭包调用之前被释放了,那么弱引用就会自动变为 nil

举个例子:

swift 复制代码
class MyClass {
    var closure: (() -> Void)?
    
    func setupClosure() {
        closure = { [weak self] in
            guard let strongSelf = self else { return }
            print(strongSelf)
        }
    }
}

MyClass 强引用 closureclosure 中又强引用 self,因此,如果在 closure 的闭包中不使用 weak self,将产生循环引用,导致 MyClass 无法释放。

unowned self

unowned self 表示对 self 的无主引用,和 weak self 一样,也会对 self 进行弱引用,但它是一个不安全的弱引用,也就是说,闭包调用的时候如果 self 已经释放了,程序将会崩溃 。和 weak self 还有一点不同的是,闭包中的 self 并不是可选类型,因此在使用时不需要解包。

还是上边的例子,如果用 unowned self 实现:

swift 复制代码
class MyClass {
    var closure: (() -> Void)?
    
    func setupClosure() {
        closure = { [unowned self] in
            print(self)
        }
    }
}

总结一下

  1. weak selfunowned self 都能对 self 进行弱引用,都能解决循环引用的问题。

  2. weak self 的作用下,即使 self 已经释放了,在闭包中访问也是安全的 (只要不强制解包 self)。

  3. unowned self的作用下,如果 self 已经释放了,在闭包中访问 self 会导致 crash,因此当你明确知道闭包中的 self 在闭包生命周期内始终存在时,才可以使用 unowned self,比如两个实例之间的关系是父子关系,并且子实例的生命周期不会超过父实例的情况下。

  4. 使用 unowned self 的好处是不需要在闭包中对 self 进行解包操作。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
初级代码游戏1 小时前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui4 小时前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhangfeng11337 小时前
CSDN星图 支持大模型微调 trl axolotl Unsloth 趋动云 LLaMA-Factory Unsloth ms-swift 模型训练
服务器·人工智能·swift
Boxsc_midnight8 小时前
【openclaw+imessage】【免费无限流量】集成方案,支持iphone手机+macos
ios·智能手机·iphone
感谢地心引力17 小时前
安卓、苹果手机无线投屏到Windows
android·windows·ios·智能手机·安卓·苹果·投屏
2501_915918411 天前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
Swift社区1 天前
Flutter 路由系统,对比 RN / Web / iOS 有什么本质不同?
前端·flutter·ios
zhyongrui1 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
Andy Dennis1 天前
ios开发 xcode配置
ios·cocoa·xcode
JoyCong19981 天前
iOS 27 六大功能前瞻:折叠屏、AI Siri与“雪豹式”流畅体验,搭配ToDesk开启跨设备新协作
人工智能·ios·cocoa