2
    CTFontRef font = CTFontCreateWithName((__bridge  CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
    NSRange  rangeHighlight = NSMakeRange(range.location, substringToHighlight.length);
    if (font) {
        [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge  id)font range:rangeHighlight];
        CFRelease(font); //Is this still necessary?
    }

我从https://github.com/mattt/TTTAttributedLabel复制并粘贴此代码

  CTFontRef font = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
  if (font) {
    [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)font range:boldRange];
    [mutableAttributedString addAttribute:@"TTTStrikeOutAttribute" value:[NSNumber numberWithBool:YES] range:strikeRange];
    CFRelease(font);
  }

当我这样做时,我得到一个错误,说我必须使用关键字 __bridge。它是什么?我把它和编译错误停止。但后来我想知道我是否还需要使用 CFRelease(font)

此外

  1. CFRelease 中的 CF 是什么?
  2. 什么是__bridge?
  3. 使用 __bridge 后我应该做 CFRelease(font) 吗?
  4. 我在哪里可以了解更多信息?
4

2 回答 2

2

是的,您仍然需要使用 CFRelease(font)。

您仍然是创建字体的人,因此您也需要发布它。__bridge 部分与字体名称是否保留有关。

  1. CF 是 Core Foundation 的缩写,它是 Foundation 所基于的 C 级 API。CFRelease 是您发布核心基础对象的方式。

  2. __bridge 告诉 ARC 在将对象转换为 Core Foundation 对象时应该如何保留或不保留对象。这个问题解释了不同的 __bridge 类型。

  3. 您仍然应该释放(如上所述)。

  4. 搜索“核心基础”。设计概念解释了一般设计。

于 2013-01-31T09:53:01.547 回答
2
  1. CF 代表“核心基金会”。CTFontRef 是 Core Foundation 类型,因此您可以使用 CFRelease() 释放它。

  2. __bridge是从可保留类型转换为不可保留类型(反之亦然)时使用的关键字,用于告诉编译器不应发生所有权更改。

  3. 是的,因为__bridge不会改变所有者的身份。

  4. 该文档相当全面。

于 2013-01-31T09:53:56.067 回答