Сильный, слабый или неизвестный в эталонном цикле с таймером
У меня есть UIViewController
это имеет отношение к Timer
объект, который вызывает замыкание неоднократно. Timer
захват объекта self
в своем блоке. Насколько я понимаю, это приводит к retains cycle
между контроллером вида и блоком. Существует логика для установки таймера на ноль, и затем цикл сохранения прерывается, но он может не выполняться.
Мой вопрос заключается в следующем: View Controller будет жить до тех пор, пока приложение живет (по крайней мере, в текущей реализации). В этом случае - как мне лучше всего позаботиться об этом цикле сохранения? Должен ли я игнорировать это, поскольку контроллер View не будет выпущен в любом случае. Должен ли я рассмотреть возможные будущие изменения и справиться с unowned
или же weak
ссылки и какой. Я думаю, это должно быть unowned
поскольку таймер удерживается только контроллером просмотра, его следует разблокировать после освобождения контроллера просмотра, но не уверен, что я что-то упустил. Заранее спасибо. Следующий код является простым примером того, о чем я говорю. Class A
это контроллер вида.
class A {
var timer: Timer? = nil
var varToReference: Int = 0
func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: { (theTimer) in
self.varToReference += 1
})
}
func stopTimer() {
if let theTimer = timer {
theTimer.invalidate()
timer = nil
}
}
func onAdapterStarts() {
self.startTimer()
}
func onAdapterStops(){
self.stopTimer()
}
deinit {
print("A Deinit")
}
}
2 ответа
Цикл сохранения - это условие, когда два объекта сохраняют ссылку друг на друга и сохраняются. Он создает цикл, поскольку оба объекта пытаются сохранить друг друга.
Теперь давайте возьмем ваш пример кода
В вашем примере Class A
владеет закрытием через timer
переменная. Если вы не объявите self
как weak
или же unowned
закрытие также будет владеть self
создание сильного справочного цикла.
Разница между unowned
а также weak
Простая разница между unowned
а также weak
в том, что weak
объявляется необязательным, где как unowned
не является. Объявив это weak
Вы можете справиться со случаем, что в какой-то момент в закрытии может быть ноль. Если вы попытаетесь получить доступ к unowned
переменная с нулевым значением приведет к сбою всей программы. Так что используйте только unowned
когда вы уверены, что переменная всегда будет вокруг, в то время как закрытие вокруг
Всегда будьте готовы к работе, так как ваша работа в любом мобильном приложении всегда должна расширяться.
В твоем случае weak
а также unowned
приемлемы С простым кодом внутри блока таймера я предлагаю использовать weak
В противном случае вы можете предпочесть unowned
, использование weak
заботиться о будущих обновлениях и расширениях вашего проекта.
timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: {[weak self] (theTimer) in
self?.varToReference += 1
})