是否需要在单例类中使用弱引用?
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()
}
}
}
}
答案
DispatchQueue
闭包根本不添加任何捕获列表,无处。
[DispatchQueue
闭包不会导致保留循环,因为self
不拥有它们。
基本上不需要单例对象内的捕获列表,因为单例永远不会被释放。
另一答案
某些单身人士的生命周期与App生命周期息息相关。一些单身人士的生命周期与登录/注销有关。
那么,如果注销时要释放单身人士怎么办?我认为使用[weak self]
是有用的,即使是单身人士也是如此。
[否则正如vadian所说,DispatchQueue
闭包不会引起保留周期,因为self不拥有它们。有关更多信息,请参见here
以上是关于是否需要在单例类中使用弱引用?的主要内容,如果未能解决你的问题,请参考以下文章