我有使用“__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,因为它们是
名称中带有“创建”或“复制”的函数不会返回(比较“Core Foundation的内存管理编程指南”中的"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 vs.CFBridgingRelease/CFBridgingRetain?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18067108/

10-12 05:36