在我们的应用中,我们生成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 指向此。
有什么建议可以避免这种情况吗?
答案 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)
}
...