У сесії WWDC 2014 403 Intermediate Swift та стенограма з'явився такий слайд
Доповідач сказав у такому випадку, якщо ми не використовуємо [unowned self]
його, це буде витоком пам'яті. Чи означає це, що ми завжди повинні використовувати [unowned self]
всередині закриття?
У рядку 64 програми ViewController.swift програми Swift Weather я не використовую [unowned self]
. Але я оновлюю інтерфейс користувача, використовуючи деякі @IBOutlet
s, як self.temperature
і self.loadingIndicator
. Це може бути нормально, тому що всі @IBOutlet
визначені мною є weak
. Але для безпеки ми завжди повинні користуватися [unowned self]
?
class TempNotifier {
var onChange: (Int) -> Void = {_ in }
var currentTemp = 72
init() {
onChange = { [unowned self] temp in
self.currentTemp = temp
}
}
}
onChange
має бути [weak self]
закриття, оскільки це загальнодоступне (внутрішньо, але все-таки) властивість, щоб інший об’єкт міг отримати та зберігати закриття, зберігаючи об’єкт TempNotifier навколо (на невизначений час, якщо об’єкт, що використовує, не відпускав onChange
закриття, поки він не побачить, що TempNotifier
зникне, через його власний слабкий перелік до TempNotifier
) . Якщо var onChange …
були , private var onChange …
то [unowned self]
було б правильно. Я не впевнений у цьому на 100%; хтось мене виправить, будь ласка, якщо я не прав
[]
? Я не можу знайти пояснення в документах Apple.
{}
це порожнє закриття (екземпляр закриття) як за замовчуванням (нічого не робить), (Int) -> Void
це визначення закриття.