Сильный, слабый или неизвестный в эталонном цикле с таймером

У меня есть 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

    })
Другие вопросы по тегам