我有一个在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引用。
那么,在你看来,“正确”的方式是什么?还有其他建议吗?
发布于 2012-12-23 06:45:18
另一个选择是将方法命名为类似于createCTFont的方法。我不知道分析器是否会考虑这一点来暗示CF对方法的创建规则;如果没有,您可以添加一个注释来显式声明该方法返回所有权:
- (CTFontRef) createCTFont CF_RETURNS_RETAINED;如果在创建消息之后没有发布,那么用这种方式命名方法应该会使读者产生怀疑,并且注释肯定会使分析器在相同的情况下产生可疑。
https://stackoverflow.com/questions/13988322
复制相似问题