Утечка памяти в расширении UIButton для анимации fadeOut в swift4 - PullRequest
0 голосов
/ 23 мая 2018

Я создал расширение для класса UIButton, чтобы сделать fadeOut.Когда я использую это, я получаю предупреждение утечки памяти в профилировщике.Я использую Swift 4 и Xcode 9.3.

Заранее благодарим за любую помощь.

extension UIButton {
    func fadeOut() { 
        let fadeOut = CABasicAnimation(keyPath: "opacity")
        fadeOut.duration = 0.35
        fadeOut.fromValue = 1
        fadeOut.toValue = 0.0
        fadeOut.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        fadeOut.autoreverses = false
        fadeOut.repeatCount = 0
        fadeOut.isRemovedOnCompletion = true

        self.layer.add(fadeOut, forKey: nil)
    }
}

Функция вызова приведена ниже.Также обратите внимание: new, level и card - это кнопки UIB.Когда я комментирую button.fadeout() в функции ниже, утечка памяти исчезает согласно профайлеру XCode.Надеюсь, что это дает больше контекста.Если для анализа требуется какая-либо другая информация, я с удовольствием предоставлю эту информацию.

private func menu_fadeout(){        
    func menu_fadeout_helper(_ button:UIButton){
        button.fadeOut()
        button.isHidden = true
        button.isEnabled = false
    }

    menu_fadeout_helper(hint)
    menu_fadeout_helper(new)
    menu_fadeout_helper(level)
    menu_fadeout_helper(card)
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

После большого количества возни оказывается, что слои анимации вызывают утечки по разным причинам - у большинства есть догадки, но нет точных ответов.

Чтобы решить мою проблему, я переопределил функцию fadeOut, не используя CABasicAnimation и не используя UIView..animate и никаких других изменений в коде.У профайлера сейчас проблем нет - все хорошо.Спасибо!

К вашему сведению, при использовании укусов в контексте кнопок и т. Д. Могут возникнуть непреднамеренные утечки.

0 голосов
/ 23 мая 2018

Посмотрев на код пару минут, я вижу проблему.В твоей функции.,.

private func menu_fadeout(){        
    func menu_fadeout_helper(_ button:UIButton){
        button.fadeOut()
        button.isHidden = true
        button.isEnabled = false
    }

    menu_fadeout_helper(hint)
    menu_fadeout_helper(new)
    menu_fadeout_helper(level)
    menu_fadeout_helper(card)
}

.,.Вы никогда не ссылаетесь непосредственно на подсказку UIButtons, new, level и card.В конце концов, после нажатия кнопок много раз, память не будет заполняться ничем, и ваше приложение будет зависать.(или хуже)

Измените функцию на эту, чтобы (предположительно) устранить утечку памяти.

private func menu_fadeout(){        
    func menu_fadeout_helper(_ button: UIButton) -> UIButton {
        button.fadeOut()
        button.isHidden = true
        button.isEnabled = false

        return button
    }

    menu_fadeout_helper(self.hint)
    menu_fadeout_helper(self.new)
    menu_fadeout_helper(self.level)
    menu_fadeout_helper(self.card)
}
...