作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有这段代码使用“__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”的函数返回(比较“核心基础内存管理编程指南”中的"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/
有人能告诉我为什么会泄漏吗?我正在使用 CFRelease(),我认为它会释放 CFURLRef soundFileURLRef 调用函数“CFBridgingRetain”返回一个保留计数为 +1
我有这段代码使用“__bridge”来转换颜色的 id: CGColorRef tabColor = (5 == 5 ? [UIColor blu
我是一名优秀的程序员,十分优秀!