Поток 1: EXC_BAD_ACCESS при использовании селектора с двумя аргументами

#swift4.2

#swift4.2

Вопрос:

Внутри происходит сбой runTimer() из-за двух аргументов. Если я добавляю только один или ничего — все работает нормально. Сбой при пересылке в AppDelegate и ошибка

Поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x4)

 var timer = Timer()
var seconds = Int()

@IBOutlet weak var twoMinView: UIView!
@IBOutlet weak var twoMinLabel: UILabel!

@objc func twoMinTimer() {
        seconds = 120
        runTimer(view: twoMinView, label: twoMinLabel)
}

@objc func runTimer(view: UIView, label: UILabel) {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyViewController.updateTimer(view:withLabel:)), userInfo: nil, repeats: true)
}

@objc func updateTimer(view: UIView, withLabel label: UILabel) {
    seconds -= 1

    if seconds < 1 {
        view.isHidden = true
        timer.invalidate()

        if view == twoMinView {
            streamView.isHidden = false
        }
    }

    label.text = timeString(time: TimeInterval(seconds))
}

@objc func timeString(time: TimeInterval) -> String {
    let minutes = Int(time) / 60 % 60
    let seconds = Int(time) % 60

    return String(format: "i : i", minutes, seconds)
}
  

Комментарии:

1. Что такое withLabel ? разве это не должно быть просто label ?

2. это может быть, но это не влияет на результат

3. Итак, вы говорите в таймере обновления, что выполнение view:label: не имеет значения?

4. Именно это я и имею в виду

Ответ №1:

Просто удалите updateTimer и замените runTimer следующим

 @objc func runTimer(view: UIView, label: UILabel) {
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in

            if self.seconds < 1 {
                view.isHidden = true
                timer.invalidate()

                if view == self.twoMinView {
                    self.streamView.isHidden = false
                }
            }

            label.text = self.timeString(time: TimeInterval(self.seconds))

            self.seconds -= 1
        })
    }