如何使用 CTFontCreateWithGraphicsFont 避免内存泄漏?
How to avoid memory leak with CTFontCreateWithGraphicsFont?
我已经减少了这个易于编译的代码的泄漏问题,该代码显示在 CTFontCreateWithGraphicsFont
使用和发布 ct_font
之后,将留下对 cg_font
的额外引用。这是 Apple 内部引用计数问题,还是我遗漏了一些东西,比如必须双发布 cg_font
或更改发布顺序?谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <ApplicationServices/ApplicationServices.h>
int main(int argc, char **argv) {
FILE *f = fopen("/Library/Fonts/Tahoma.ttf", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
char* font = (char*)malloc(fsize);
fread(font, fsize, 1, f);
fclose(f);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, font, fsize, NULL);
CGFontRef cg_font = CGFontCreateWithDataProvider(provider);
CTFontRef ct_font = CTFontCreateWithGraphicsFont(cg_font, 36., NULL, NULL);
CGDataProviderRelease(provider);
//
CFRelease(ct_font);
CFRelease(cg_font);
printf("ct_font: %d\ncg_font: %d\n", (int)CFGetRetainCount(ct_font), (int)CFGetRetainCount(cg_font));
free(font);
return 0;
}
编译后的结果 运行:
ct_font: -1
cg_font: 1
CGFont
的保留发生在 TInMemoryBaseFont
构造函数中:
#0 0x00007fff8928e4d0 in CFRetain ()
#1 0x00007fff86472906 in TInMemoryBaseFont::TInMemoryBaseFont(CGFont*) ()
#2 0x00007fff864728b8 in CTFontDescriptor::CTFontDescriptor(CGFont*, is_inmemory_t const&) ()
#3 0x00007fff8646cb30 in TDescriptorSource::CopyDescriptor(CGFont*, __CFDictionary const*) const ()
#4 0x00007fff8646c99a in TFont::InitDescriptor(CGFont*, __CTFontDescriptor const*) ()
#5 0x00007fff8646c7b4 in TFont::TFont(CGFont*, double, CGAffineTransform const*, __CTFontDescriptor const*) ()
#6 0x00007fff8646c775 in CTFontCreateWithGraphicsFont ()
它与发布 CTFont
时的发布不匹配,可能是因为从未调用 TInMemoryBaseFont
析构函数(原因不明)。
这不是解决方案,但可能会帮助其他人进一步调试问题。
我已经减少了这个易于编译的代码的泄漏问题,该代码显示在 CTFontCreateWithGraphicsFont
使用和发布 ct_font
之后,将留下对 cg_font
的额外引用。这是 Apple 内部引用计数问题,还是我遗漏了一些东西,比如必须双发布 cg_font
或更改发布顺序?谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <ApplicationServices/ApplicationServices.h>
int main(int argc, char **argv) {
FILE *f = fopen("/Library/Fonts/Tahoma.ttf", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
char* font = (char*)malloc(fsize);
fread(font, fsize, 1, f);
fclose(f);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, font, fsize, NULL);
CGFontRef cg_font = CGFontCreateWithDataProvider(provider);
CTFontRef ct_font = CTFontCreateWithGraphicsFont(cg_font, 36., NULL, NULL);
CGDataProviderRelease(provider);
//
CFRelease(ct_font);
CFRelease(cg_font);
printf("ct_font: %d\ncg_font: %d\n", (int)CFGetRetainCount(ct_font), (int)CFGetRetainCount(cg_font));
free(font);
return 0;
}
编译后的结果 运行:
ct_font: -1
cg_font: 1
CGFont
的保留发生在 TInMemoryBaseFont
构造函数中:
#0 0x00007fff8928e4d0 in CFRetain ()
#1 0x00007fff86472906 in TInMemoryBaseFont::TInMemoryBaseFont(CGFont*) ()
#2 0x00007fff864728b8 in CTFontDescriptor::CTFontDescriptor(CGFont*, is_inmemory_t const&) ()
#3 0x00007fff8646cb30 in TDescriptorSource::CopyDescriptor(CGFont*, __CFDictionary const*) const ()
#4 0x00007fff8646c99a in TFont::InitDescriptor(CGFont*, __CTFontDescriptor const*) ()
#5 0x00007fff8646c7b4 in TFont::TFont(CGFont*, double, CGAffineTransform const*, __CTFontDescriptor const*) ()
#6 0x00007fff8646c775 in CTFontCreateWithGraphicsFont ()
它与发布 CTFont
时的发布不匹配,可能是因为从未调用 TInMemoryBaseFont
析构函数(原因不明)。
这不是解决方案,但可能会帮助其他人进一步调试问题。