是否需要在单例类中使用弱引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否需要在单例类中使用弱引用?相关的知识,希望对你有一定的参考价值。

我遇到了raywenderlich的教程,作者为处理单例中的线程问题提供了一些很好的技巧。但是,当使用单例类中的闭包时,他使用的是“弱”引用循环。确实需要吗,因为类是单例,所以它应该总是有一个实例?

    final class PhotoManager {
      private init() {}
      static let shared = PhotoManager()

      private var unsafePhotos: [Photo] = []

    let concurrentPhotoQueue = DispatchQueue(label: "com.jeesson.googlypuff.photoQueue", attributes: .concurrent)
      var photos: [Photo] {
        var photoCopy:[Photo]!    
        concurrentPhotoQueue.sync {
            photoCopy = self.unsafePhotos
        }
        return photoCopy
      }

      func addPhoto(_ photo: Photo) {

// Do we need 'weak self here.. and why?
        concurrentPhotoQueue.async(flags: .barrier) {[weak self] in
            // 1
            guard let self = self else {
                return
            }
            self.unsafePhotos.append(photo)
            DispatchQueue.main.async { [weak self] in
                //self?.postContentAddedNotification()
            }
        }



      }

    }

The tutorial

答案

DispatchQueue闭包根本不添加任何捕获列表,无处。

[DispatchQueue闭包不会导致保留循环,因为self不拥有它们。

基本上不需要单例对象内的捕获列表,因为单例永远不会被释放。

另一答案

某些单身人士的生命周期与App生命周期息息相关。一些单身人士的生命周期与登录/注销有关。

那么,如果注销时要释放单身人士怎么办?我认为使用[weak self]是有用的,即使是单身人士也是如此。

[否则正如vadian所说,DispatchQueue闭包不会引起保留周期,因为self不拥有它们。有关更多信息,请参见here

以上是关于是否需要在单例类中使用弱引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速创建单例类? [复制]

使用python中的构造函数限制在单例类中创建对象

C++ 难以在单例类中创建类的实例

在单例类构造函数中进行 Ajax 调用

漫画趣说单例模式

28.C++- 单例类模板(详解)