gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:11:29 37 4
gpt4 key购买 nike

我有这段代码使用“__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”的函数返回(比较“核心基础内存管理编程指南”中的"The Create Rule")。并且因为您不拥有这些对象,所以您不能将所有权“转移”给 ARCCFBridgingRelease()。所以

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

是正确的。和

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

也是正确的,因为

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

会将一个 (+1) 保留数组传递给 CGGradientCreateWithColors()。这将是一段记忆泄漏,因为该函数不会释放 colors 参数。

关于ios - 什么时候应该使用 __bridge 与 CFBridgingRelease/CFBridgingRetain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18067108/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com