Может кто-нибудь объяснить, почему это не просачивается?Swift - Ожидание утечки после сильного захвата себя в закрытии
Я захватывая self
в closure
, так что я бы две сильные указатели, указывающие друг на друга, поэтому deinit
сообщение должно никогда не вызывается для объекта Person.
Во-первых, это мой класс Person:
class Person {
var name: String
init(name: String) { self.name = name }
deinit { print("\(name) is being deinitialized") }
}
И это реализация моего ViewController в:
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' будет по-прежнему деинизировать. См. Мой ответ – Alexander
@AlexanderMomchliov Если закрытие сохраняет VC (self), а VC сохраняет замыкание, как в моем примере, тогда VC никогда не освобождается (и не закрывается). Если VC никогда не деинизирует, то он, в свою очередь, не выпускает свою ссылку на объект Person, а это означает, что объект Person никогда не исчезнет. –
Не имеет значения, есть ли цикл сохранения. 'john' явно установлен на' nil', удаляя последнюю ссылку, тем самым заставляя ARC 'deinit' его. – Alexander