Swift Base64字符串正在泄漏内存

时间:2017-02-27 15:55:00

标签: ios swift memory-leaks

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

我一直在寻找这个原因,显然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()
}

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

我通过点击详细信息&gt;通过仪器发现了问题调用树然后我看到了我自己的代码中的问题所在。我重构了正则表达式的代码:

// 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: "")
相关问题