
[英]When should you use lineHeightMultiple vs. lineSpacing?
[英]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对象的startColor
, endColor
因为它们的名称中没有“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.