ios - 什么时候应该使用 __bridge 与 CFBridgingRelease/CFBridgingRetain?

标签 ios objective-c cocoa-touch core-graphics automatic-ref-counting

我有这段代码使用“__bridge”来转换颜色的 id:

  CGColorRef tabColor = (5 == 5
                         ? [UIColor blueColor].CGColor
                         : [UIColor greenColor].CGColor);

  CGColorRef startColor = [UIColor whiteColor].CGColor;
  CGColorRef endColor   = tabColor;
  NSArray    *colors    = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];

  CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);

但是会:

  NSArray    *colors    = [NSArray arrayWithObjects:(id)CFBridgingRelease(startColor), (id)CFBridgingRelease(endColor), nil];

  CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)CFBridgingRetain(colors), locations);

是更好的解决方案?

最佳答案

您不“拥有”Core Foundation 对象startColorendColor,因为它们是 不是由名称中包含“Create”或“Copy”的函数返回(比较“核心基础内存管理编程指南”中的"The Create Rule")。 并且因为您不拥有这些对象,所以您不能将所有权“转移”给 ARC CFBridgingRelease()。所以

[NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];

是正确的。和

CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);

也是正确的,因为

CGGradientCreateWithColors(colorSpace, (CFArrayRef)CFBridgingRetain(colors), locations);

会将一个 (+1) 保留数组传递给 CGGradientCreateWithColors()。这将是一段记忆 泄漏,因为该函数不会释放 colors 参数。

关于ios - 什么时候应该使用 __bridge 与 CFBridgingRelease/CFBridgingRetain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18067108/

相关文章:

iphone - UICollectionView:如何在页脚和页眉之间添加空间?

iphone - 如何向 UILabel 添加反射。 IOS

ios - 获取从 UITableViewController 中选择的行

iphone - 以编程方式检测图像大小-iPhone

ios - 模仿 tableView :willBeginEditingRowAtIndexPath: on UIViewController 的 UITableViewControllers 行为

ios - 我们是否需要 2 个配置文件来在 iOS 中实现小部件(扩展)和主应用程序?

ios - 如何在 Firebase 中删除具有多个子对象的对象?

ios - 如何设置MKMapView视角和关闭3D建筑?

objective-c - NSOutputStream 多次写入

iphone - viewDidLoad 被调用,viewWillAppear 没有被调用, View 没有出现在屏幕上