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(字体)
另外
答案 0 :(得分:2)
是的,你仍然需要使用CFRelease(字体)。
您仍然是创建字体的人,因此您也需要将其发布。 __bridge部分与字体 name 的保留方式有关。
CF是Core Foundation的缩写,Core Foundation是基础构建的C级API。 CFRelease是您发布Core Foundation对象的方式。
__ bridge告诉ARC在将对象转换为Core Foundation对象时应该如何保留或不保留对象。 This question解释了不同的__bridge类型。
您仍然应该发布(如上所述)。
搜索“核心基础”。 Design Concepts解释了一般设计。
答案 1 :(得分:2)
CF代表“核心基金会”。 CTFontRef是Core Foundation类型,因此您可以使用CFRelease()释放它。
__bridge
是从可保留类型转换为非保留类型(反之亦然)时使用的关键字,用于告诉编译器不应发生所有权更改。
是的,因为__bridge
不会改变所有者的身份。
This documentation相当全面。