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

标签 swift memory-leaks uibutton swift-extensions

我构建了 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)
    }
}

调用函数如下。另请注意:new、level 和card 都是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)
}

关于swift - swift4 中用于淡出动画的 UIButton 扩展中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50481882/

相关文章:

swift - 我们可以在 watchOS 中重叠 UI 元素吗?

linux - 在 ubuntu/linux 上使用 NSJSONSerialization 和 swift

iphone - 编译器说存在内存泄漏,但我没有看到内存泄漏

ios - 目标为 :self not being sent to self? 的 UIButton

swift - 如何将相机或图库拍摄的图像添加到按钮?

swift - 在 Swift 字典中递增或初始化 Int 的最佳方式

ios - 使用 AppDelegate 为核心数据定义上下文作为单例

c# - 使用页面和 BitmapImage 的 WPF 应用程序中的内存泄漏

c - 向我的小游戏添加功能时出现奇怪错误 (0xC0000005)

css - 如何创建圆 Angular 按钮?