我有一个在 ARC (DTCoreText) 上运行的项目,我想在 UIFont 上实现一个返回匹配 CTFontRef 的类别方法。这是我到目前为止所拥有的:
@implementation UIFont (DTCoreText)
+ (UIFont *)fontWithCTFont:(CTFontRef)ctFont
{
NSString *fontName = (__bridge_transfer NSString *)CTFontCopyName(ctFont, kCTFontPostScriptNameKey);
CGFloat fontSize = CTFontGetSize(ctFont);
return [UIFont fontWithName:fontName size:fontSize];
}
- (CTFontRef)CTFont
{
CTFontRef newFont = CTFontCreateWithName((__bridge CFStringRef)self.fontName, self.pointSize, NULL);
return newFont;
}
@end
从技术上讲,这会返回 +1 引用,因为没有自动释放 CF 对象。
在我的代码中,我这样称呼它:
- (void)replaceFont:(UIFont *)font inRange:(NSRange)range
{
[self beginEditing];
[self removeAttribute:(id)kCTFontAttributeName range:range];
CTFontRef ctFont = [font CTFont];
[self addAttribute:(id)kCTFontAttributeName value:CFBridgingRelease(ctFont) range:range];
[self endEditing];
}
由于 CFBridgingRelease,这没有分析警告,但我担心有人从类别方法的名称中不清楚这一点。
一个不同的建议是使用 C 函数进行创建:
static CTFontRef CTFontCreateFromUIFont(UIFont *font)
这会更明显,因为名称中的Create告诉开发人员他正在获得 +1 参考。
那么您认为“正确”的方式是什么?还有其他建议吗?