0

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により、より明白になります。

それで、あなたの意見で「正しい」方法は何ですか?他の提案はありますか?

4

1 に答える 1

2

別のオプションは、メソッドに のような名前を付けることですcreateCTFont。メソッドに対する CF の Create ルールを意味するものとしてアナライザーがそれを考慮するかどうかはわかりません。そうでない場合は、アノテーションを追加して、メソッドが所有権を返すことを明示的に宣言できます。

- (CTFontRef) createCTFont CF_RETURNS_RETAINED;

このようにメソッドに名前を付けると、作成メッセージの後にリリースがない場合、読者は疑いを抱くはずです。同じ状況では、注釈によってアナライザーが間違いなく疑わしくなります。

于 2012-12-23T06:45:18.210 に答える