什么时候应该使用__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?
您不拥有核心基础对象startColor
, endColor
因为它们不是由其名称中具有“创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);