UIButton 扩展中的内存泄漏,用于 swift4 中的淡出动画



我构建了一个UIButton类的扩展来做淡出。当我使用它时,我在探查器中收到内存泄漏警告。我正在使用 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)
}

盯着代码几分钟后,我看到了问题。在你的函数中。。。

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

经过大量探索,事实证明动画层由于各种原因导致泄漏 - 大多数都有猜测但没有准确的答案。

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

仅供参考,每当在按钮等上下文中使用刺痛时,似乎都会无意中泄漏。如果有人对该主题有任何指示或建议,将不胜感激。

  • 查找参考周期(在捕获列表中使用弱/无主自我(
  • 从图层中删除所有动画
  • 使计时器失效(如果有(

最新更新