即使在定义捕获列表时,GCD仍然强烈引用“自我”

时间:2017-04-21 09:58:04

标签: ios swift strong-references capture-list

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

运行上面的代码时,即使MyViewController弹出导航堆栈或被解散,MyClass也永远不会被释放。

但是,如果我将MyClass的实现直接移动到MyViewController,一切都按预期工作:

class MyClass {
    var someProperty = 0

    deinit {
        // never gets called
    }

    func doSomething() {
        DispatchQueue.global().async { [weak self] in
            Thread.sleep(forTimeInterval: 3600)
            self?.someProperty = 123
        }
    }
}

class MyViewController: UIViewController {
    var myClass: MyClass?

    deinit {
        // MyViewController gets properly deallocated
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        myClass = MyClass()
        myClass?.doSomething()
    }
}

我使用调试内存图来确定什么仍然保留对MyClass实例的引用,这就是我得到的:

enter image description here

为什么还有参考?我在这里缺少什么?

更新

所以我试图找出它与MyViewController一起工作的原因,但是当它们之间有另一个实例时却没有。似乎从NSObject继承有所作为。当我从NSObject继承MyClass时,会调用deinit,一旦完成长操作,self就会被正确设置为nil。

现在的问题是,Swift中的捕获列表与NSObject相关的是什么?

0 个答案:

没有答案