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

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

成为更好的解决scheme?

您不拥有核心基础对象startColorendColor因为它们不是由其名称中具有“创build”或“复制”的函数返回的(比较“内存pipe理编程指南”中的“ 创build规则”基础“,因为你不拥有这些对象,所以你不能用CFBridgingRelease()把所有权转移给ARC。

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

是正确的。 和

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

也是正确的,因为

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

会传递(+1)保留的数组到CGGradientCreateWithColors() 。 这将是一个内存泄漏,因为该函数不释放colors参数。

与NSURL是同样的问题

 NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; AudioServicesCreateSystemSoundID(CFBridgingRetain(soundURL), &soundEffect);