iOS Swift 5,自动释放CoreText和CoreGraphics内存

问题描述

我正在使用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的关联内存的技巧。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...