Upputton扩展中的内存泄漏,用于swift4中的fadeOut动画

时间:2018-05-23 07:04:55

标签: swift memory-leaks uibutton swift-extensions

我为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)
    }
}

调用函数如下。另请注意:新的,级别和卡是UIButtons。当我在下面的函数中注释掉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 :(得分:0)

在盯着代码几分钟后,我看到了问题。在你的功能。 。

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提示,新的,级别和卡。最后,按下按钮很多次后,内存将无法填满,您的应用程序将崩溃。 (或更糟)

将功能更改为(假设)删除内存泄漏。

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)
}

答案 1 :(得分:0)

经过大量的探讨后,由于各种原因,动画层会导致泄漏 - 大多数都有猜测但没有精确的答案。

为了解决我的问题,我重新实现了fadeOut函数,而没有使用CABasicAnimation并使用UIView.animate并且没有对代码进行其他更改。探查器现在没有问题 - 一切都很好。谢谢!

只要在按钮等环境中使用叮当声,似乎无意中就会发生泄密。如果有人对该主题有任何指示或建议,我们会很感激。