【问题标题】:Will this code leak if I remove CFRelease?如果我删除 CFRelease,此代码会泄漏吗?
【发布时间】:2013-01-15 08:40:19
【问题描述】:
    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. 在哪里可以了解更多信息?

【问题讨论】:

    标签: objective-c xcode4.5


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:
      1. CF 代表“核心基础”。 CTFontRef 是 Core Foundation 类型,因此您可以使用 CFRelease() 释放它。

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

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

      4. This documentation 比较全面。

      【讨论】:

      • 我认为 CFStringRef 和 NSString * 都是可以保留的,除了 ARC 会自动处理保留的东西吗?所以 CTFontCreateWithName 将保留计数增加 1 我正确吗?
      • CFStringRef are 本身是可保留的,但不是 ARC 所关心的。如果它是指向 Objective-C 对象的指针(与指向 float 或任何其他类型的结构等的指针相反),则 ARC 认为类型“可保留”。 CFStringRef 不是 Objective-C 对象,所以为了 ARC,它们是不可保留的。有处理所有权转移的函数CFBridgingReleaseCFBridgingRetain。在你的情况下,我认为你可以摆脱 __bridge CFRelease() 如果你用CFBridgingRelease(font)替换演员表。
      • 我做了 CFBridgingRelease(CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL)) 但它不起作用。
      猜你喜欢
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多