如果我删除CFRelease,这段代码会泄漏吗?

时间:2013-01-31 09:35:43

标签: objective-c xcode4.5

    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(字体)

另外

  1. CF发布中的CF是什么?
  2. 什么是__bridge?
  3. 使用__bridge后,我应该使用CFRelease(字体)吗?
  4. 我在哪里可以了解更多相关信息?

2 个答案:

答案 0 :(得分:2)

是的,你仍然需要使用CFRelease(字体)。

您仍然是创建字体的人,因此您也需要将其发布。 __bridge部分与字体 name 的保留方式有关。

  1. CF是Core Foundation的缩写,Core Foundation是基础构建的C级API。 CFRelease是您发布Core Foundation对象的方式。

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

  3. 您仍然应该发布(如上所述)。

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

答案 1 :(得分:2)

  1. CF代表“核心基金会”。 CTFontRef是Core Foundation类型,因此您可以使用CFRelease()释放它。

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

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

  4. This documentation相当全面。