0

我有一个在 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 参考。

那么您认为“正确”的方式是什么?还有其他建议吗?

4

1 回答 1

2

另一种选择是将方法命名为createCTFont. 我不知道分析器是否会认为这意味着 CF 对方法的创建规则;如果没有,您可以添加注释以显式声明该方法返回所有权:

- (CTFontRef) createCTFont CF_RETURNS_RETAINED;

以这种方式命名该方法应该会让读者怀疑,如果在创建消息之后没有发布,那么注释肯定会使分析器在相同情况下产生怀疑。

于 2012-12-23T06:45:18.210 回答