首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何命名和处理返回CFType的函数的内存管理

如何命名和处理返回CFType的函数的内存管理
EN

Stack Overflow用户
提问于 2012-12-21 10:25:24
回答 1查看 200关注 0票数 0

我有一个在ARC (DTCoreText)上运行的项目,我希望在UIFont上实现一个类别方法,该方法返回一个匹配的CTFontRef。到目前为止,这就是我所拥有的:

代码语言:javascript
复制
@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对象。

在我的代码中,我这样称呼它:

代码语言:javascript
复制
- (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-函数来创建:

代码语言:javascript
复制
static CTFontRef CTFontCreateFromUIFont(UIFont *font)

这将更加明显,因为名称中的Create告诉开发人员他正在获得+1引用。

那么,在你看来,“正确”的方式是什么?还有其他建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-23 06:45:18

另一个选择是将方法命名为类似于createCTFont的方法。我不知道分析器是否会考虑这一点来暗示CF对方法的创建规则;如果没有,您可以添加一个注释来显式声明该方法返回所有权:

代码语言:javascript
复制
- (CTFontRef) createCTFont CF_RETURNS_RETAINED;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13988322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档