问题描述
我正在使用CoreText和CoreGraphics从目录中的文件中加载字体,然后在for循环中使用以下代码根据字体元数据中支持的unicode字符对它们进行分类:
if let provider = CGDataProvider(url: fontFileURL as CFURL) {
if let font = CGFont(provider) {
let ctFont = CTFontCreateWithGraphicsFont(font,12,nil,nil)
let chSet = CTFontCopyCharacterSet(ctFont)
let cSet = chSet as CharacterSet
let isAr = cSet.contains(Unicode.Scalar.init(unicodeScalarLiteral: "ب"))
let isEn = cSet.contains(Unicode.Scalar.init(unicodeScalarLiteral: "b"))
print(++index,isAr,isEn)
}
}
,但是在前循环完成文件循环之前的某个时间点,应用程序崩溃,并显示错误消息Terminated due to memory issue
,因此我怀疑这四个函数之一泄漏内存,或者至少我不这样做。 t正确处理那里的内存:
CGDataProvider: constructor
CGFont: constructor
CTFontCreateWithGraphicsFont: func to convert CGFont to CTFont
CTFontCopyCharacterSet: get a copy of CharacterSet supported by the CTFont
我尝试用autoreleasepool
包装代码,但没有帮助。
在继续循环到下一个字体文件之前,请问有什么方法可以释放已分配的内存!!!
解决方法
将此代码从for循环中提取到另一个函数中,可以完成释放带有已加载的CGFont和复制的CharacterSet的关联内存的技巧。