请看一下。我不确定下面的代码是否有一个保留周期。
我查看了其他与retain cycle相关的帖子和文章,但仍然不清楚下面的代码。我故意重命名类和其他东西。
import UIKit
class SomeInterface {
var queue: OperationQueue?
private static var sharedInterface: SomeInterface = SomeInterface()
class func getInterface() -> SomeInterface {
return sharedInterface
}
init() {
queue = OperationQueue()
}
class func add(toQueue block : @escaping ()->Void) {
SomeInterface.getInterface().queue?.addOperation(block)
}
func someWork() {
print("some work")
}
deinit {
print("deinitlized")
}
}
// Here instance of SomeInterface holding strong reference to **queue**, And //**queue** retains the closure and closure eventually capture "**self**"
class InterfaceCore {
class func executeSomeWork() {
SomeInterface.add(toQueue: { // Should I use capture list here?
SomeInterface.getInterface().someWork()
})
}
}
InterfaceCore.executeSomeWork() // Would it create retain cycle?
//如果是,我用捕获列表是否正确。
class InterfaceCore {
class func executeSomeWork() {
SomeInterface.add(toQueue: { [weak weakInterface = SomeInterface.getInterface() ] in
if let _ = weakInterface {
SomeInterface.getInterface().someWork()
}
})
}
}
最佳答案
这里没有保留周期。您可以通过在isKnownUniquelyReferenced
上调用sharedInterface
来确认这一点,以查看它持有对共享实例的唯一引用。
闭包并没有捕获接口,因为它是通过getInterface
获取的,而不是首先存储对它的引用。
关于ios - 我需要使用捕获列表来避免以下代码中的保留周期吗?好像A不是直接持有B并且B持有A,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44541511/