请问为什么这个代码不会泄漏?
我在闭包中捕获了self
,这样就有两个指向彼此的强引用,因此应该永远不会调用Person
对象的deinit
方法。
首先,这是我的Person
类:
class Person {
var name: String
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
这是我的视图控制器实现:
class ViewController: UIViewController {
var john:Person?
func callClosureFunction( closure:(name:Bool) -> () ) {
closure(name: true)
}
override func viewDidLoad() {
super.viewDidLoad()
john = Person(name:"John")
self.callClosureFunction { (name) in
self.john?.name = "John Appleseed"
self.john = nil
// xcode prints - John Appleseed is being deinitialized
}
}
}
我原本希望通过以下方法解决问题:
self.callClosureFunction { [weak self] (name) in ...
但其实这并不必要。为什么呢?
John Appleseed
的Person
对象仍将被释放。请查看我的答案。 - Alexanderjohn
被明确设置为nil
,移除了最后一个引用,因此导致 ARC 将其释放。 - Alexander