根据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()
}
有谁知道如何解决这个问题?
答案 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: "")