ARC (DTCoreText) で実行されているプロジェクトがあり、一致する CTFontRef を返す UIFont にカテゴリ メソッドを実装したいと考えています。これは私がこれまでに持っているものです:
@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
技術的には、自動解放 CF オブジェクトがないため、これは +1 参照を返します。
私のコードでは、次のように呼び出しています。
- (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 のために Analyze の警告なしで実行されますが、カテゴリ メソッドの名前から誰かに明確にされていないことが心配です。
代わりに、作成に C 関数を使用するという別の提案があります。
static CTFontRef CTFontCreateFromUIFont(UIFont *font)
これは、+1 参照を取得していることを開発者に伝える名前のCreateにより、より明白になります。
それで、あなたの意見で「正しい」方法は何ですか?他の提案はありますか?