18

我有这段代码使用“__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);

是一个更好的解决方案?

4

2 回答 2

22

您不“拥有”核心基础对象startColorendColor因为它们不是由名称中包含“创建”或“复制”的函数返回的(比较“核心基础的内存管理编程指南”中的“创建规则” ) . 并且因为你不拥有这些对象,所以你不能将所有权“转移”给 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参数。

于 2013-08-05T21:16:17.840 回答
0

使用 NSURL 是同样的问题

NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"];
NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
AudioServicesCreateSystemSoundID(CFBridgingRetain(soundURL), &soundEffect);
于 2014-11-21T12:17:32.890 回答