String.replacingOccurrences具有大的String内存问题

时间:2017-12-07 01:45:11

标签: ios swift string out-of-memory

在我们的应用中,我们生成PDF文件。因此,我们使用HTML文件作为模板,并将此模板加载到String,然后将所有占位符替换为正确的值:

let template = Bundle.main.path(forResource: “reportTemplate”, ofType: "html")
do {
    var htmlTemplate = try String(contentsOfFile: template!)
    htmlTemplate = htmlTemplate.replacingOccurrences(of: “#LOGO#”, with: logoBase64)
    htmlTemplate = htmlTemplate.replacingOccurrences(of: “#TITLE#”, with: “PDF FILE“)
    htmlTemplate = htmlTemplate.replacingOccurrences(of: “#IMAGE1#”, with: reportImageBase64)
    htmlTemplate = htmlTemplate.replacingOccurrences(of: “#IMAGE2#”, with: reportImageBase64)
    //…
} catch {
    print(“\(error)“)
}

PDF可能包含多个图像,因此当我们将这些图像转换为Base64时,字符串会变大。

然后我们注意到,当我们运行生成代码时,这会导致内存问题。我们收到随机崩溃报告,因为 NSMallocException 指向此。

有什么建议可以避免这种情况吗?

1 个答案:

答案 0 :(得分:1)

尝试改变您的String 就地,因为这可能会大大减少您的内存使用量。例如:

let token = htmlTemplate.range(of: “#LOGO#”)!
htmlTemplate.replaceSubrange(token, with: logoBase64)
...

如果令牌可能出现不止一次 - 或者根本不出现! - 你也需要考虑到这一点:

while let token = htmlTemplate.range(of: “#LOGO#”) {
    htmlTemplate.replaceSubrange(token, with: logoBase64)
}
...