请看一下。我不确定下面的代码是否有一个保留周期。
我查看了其他与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/

10-13 04:08