<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实例的引用,这就是我得到的:
为什么还有参考?我在这里缺少什么?
更新
所以我试图找出它与MyViewController一起工作的原因,但是当它们之间有另一个实例时却没有。似乎从NSObject继承有所作为。当我从NSObject继承MyClass时,会调用deinit,一旦完成长操作,self就会被正确设置为nil。
现在的问题是,Swift中的捕获列表与NSObject相关的是什么?