繁体   English   中英

你何时应该使用__bridge与CFBridgingRelease / CFBridgingRetain?

[英]when should you use __bridge vs. 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);

是一个更好的解决方案

您没有“拥有”Core Foundation对象的startColorendColor因为它们的名称中没有“Create”或“Copy”的函数返回它们(比较“内存管理编程指南中的“ 创建规则”)基金会“。因为您不拥有这些对象,所以您不能使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM