【发布时间】:2012-07-23 02:18:10
【问题描述】:
我正在将我的项目转换为使用 ARC。我在 NSColor 上有一个类别,它的方法返回自动释放的 CGColor 表示:
@implementation NSColor (MyCategory)
- (CGColorRef)CGColor
{
NSColor *colorRGB = [self colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
CGFloat components[4];
[colorRGB getRed:&components[0]
green:&components[1]
blue:&components[2]
alpha:&components[3]];
CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGColorRef theColor = CGColorCreate(space, components);
CGColorSpaceRelease(space);
return (CGColorRef)[(id)theColor autorelease];
}
@end
使用 ARC 执行此操作的正确方法是什么?我不想返回保留的 CGColor。
XCode 中的 ARC 转换器建议使用
return (CGColorRef)[(__bridge id)theColor autorelease];
但这会导致以下错误消息:
[rewriter] 将结果转换为 'CGColorRef' 是不安全的 “自动释放”消息; __bridge 强制转换可能会导致指向 被破坏的对象和 __bridge_retained 可能会泄漏该对象
【问题讨论】:
-
这里有一个很好的内存泄漏。 CGColorCreate 将创建一个 CGColor 对象,每次调用此方法时该对象都将保存在内存中。我强烈建议您这样做:
CGColorRef colorRef = CGColorCreate(colorSpaceRGB, components); UIColor *retColor = [UIColor colorWithCGColor:colorRef]; CGColorRelease(colorRef); return retColor; -
你读过这个问题吗?我知道它在泄漏,这是我的问题。我想返回一个 CGColor,而不是 UIColor(无论如何,这是一个 OS X 问题,正如我提到的 NSColor 所示)。反正半年前就已经回答过了。
标签: objective-c xcode cocoa automatic-ref-counting core-foundation