【问题标题】:Swift Base64 string is leaking memorySwift Base64 字符串正在泄漏内存
【发布时间】:2017-02-27 15:55:00
【问题描述】:

根据 Instruments,我的 iOS 应用程序正在泄漏内存。

我一直在寻找这是什么原因造成的,显然 Swift 不喜欢 25000 个字符的 base64 字符串。当我跑步时

leaks Application

在命令行中我收到以下错误:

Leak: 0x7fd8a510b600 size=25088 zone: MallocHelperZone_0x11cc7a000 CFString ObjC CoreFoundation length: 24708

我使用以下代码将 base64 字符串转换为 UIImage:

// MARK: Initialization
init?(id: Int, name: String, logo: Any) {

    self.id = id
    self.name = name

    if logo is String  {
        var logo = logo as! String

        // Swift can't handle the data:image/png;base64, part of the base64 string so we remove it
        if let range = logo.rangeOfString(";base64,", range: logo.startIndex..<logo.endIndex)  {
            logo.removeRange(logo.startIndex..<range.endIndex)

            // Lets turn it into an UIImage
            let imageData = NSData(base64EncodedString: logo, options: NSDataBase64DecodingOptions(rawValue: 0))

            if imageData != nil {
                self.logo = UIImage(data: imageData!)!
            }
        }
    } else if logo is UIImage {
        self.logo = logo as? UIImage
    } else {
        self.logo = UIImage()
    }

    super.init()
}

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 过去一周我一直在努力解决类似的问题...

标签: ios swift memory-leaks


【解决方案1】:

显然,使用rangeOfString 函数删除一系列字符串是问题所在。 rangeOfString 函数无法处理“大”的字符串。

我通过 Instruments 通过单击 Details > Call Trees 找到了问题,然后我在自己的代码中看到了问题所在。我将代码重构为正则表达式:

// Swift can't handle the data:image/png;base64, part of the base64 string so we remove it
let regex = try! NSRegularExpression(pattern: "data:([\\w]+/[\\w]+);base64,", options: [])
let base64 = regex.stringByReplacingMatchesInString(logo, options: [], range: NSMakeRange(0, logo.characters.count), withTemplate: "")

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2011-08-29
    • 2013-04-03
    • 2011-06-12
    • 2018-12-17
    • 2013-12-03
    • 2011-05-04
    • 2011-08-29
    • 2017-05-09
    相关资源
    最近更新 更多