Swift 内存管理,weak 和 unowned

在内存管理中,weak和unowned都可以防止发生引用循环问题,但是weak和unowned的区别在哪里呢?

  1. unowned 更像Objective-C时代的 unsafe_unretained,而 weak 就是以前的 weak。
  2. unowned 设置以后即使它原来引用的内容已经被释放了,它仍然会保持对被已经释放了的对象的一个 "无效的" 引用,它不能是 Optional 值,也不会被指向 nil。如果你尝试调用这个引用的方法或者访问成员属性的话,程序就会崩溃。
  3. weak 则友好一些,在引用的内容被释放后,标记为 weak 的成员将会自动地变成 nil (因此被标记为 @weak 的变量一定需要是 Optional 值)。

关于两者使用的选择:
Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak。

之前有个哥们儿,全部都用unowned,因为种种原因,跳转到一个页面的时候,RxSwift闭包中引用的selfnil程序直接就崩溃了,后来他干脆全部改成weak
如果无脑开发的话,建议全部使用weak,这样至少可以保证程序不会崩溃。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容