我为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)
}
答案 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并且没有对代码进行其他更改。探查器现在没有问题 - 一切都很好。谢谢!
只要在按钮等环境中使用叮当声,似乎无意中就会发生泄密。如果有人对该主题有任何指示或建议,我们会很感激。