如何自动释放CGColorRef

时间:2010-08-17 10:21:09

标签: iphone objective-c iphone-sdk-3.0

我有一个方法返回CGColorCreate方法创建的CGColorRef实例。我需要从这个方法自动释放颜色返回。有谁知道怎么做?

//red,green,blue are from 0-255 range

+(CGColorRef) getColorFromRed:(int)red Green:(int)green Blue:(int)blue Alpha:(int)alpha
{
    CGFloat r = (CGFloat) red/255.0;
    CGFloat g = (CGFloat) green/255.0;
    CGFloat b = (CGFloat) blue/255.0;
    CGFloat a = (CGFloat) alpha/255.0;  
    CGFloat components[4] = {r,g,b,a};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef color = CGColorCreate(colorSpace, components);
    CGColorSpaceRelease(colorSpace);

    //CGColorRelease(color);
    // I need to auto release the color before returning from this.

    return color;
}

4 个答案:

答案 0 :(得分:13)

你不能直接,正如mvds所说。另外UIColorCGColorRef 免工具桥接 - 为什么转换器起作用呢?但是(虽然我不建议它 - 使用UIColor代替!)有一个技巧:

创建一个自动释放的 UIColor对象并返回它的CGColor。像这样:

return [UIColor colorWith... ].CGColor;

这将返回绑定到CGColorRef的常规UIColor对象。这意味着如果UIColor在自动释放循环中被释放,它的CGColorRef也将被释放 - 除非它被使用CGRetain(...)保留在其他地方,这是你的调用者方法应该已经完成​​,如果它想保持颜色。因此CGColorRef是伪自动释放的......

仍然:我会建议这样做。直接使用UIColor!

答案 1 :(得分:6)

你可以这样做:

CGColorRef color = (CGColorRef)[(id)CGColorCreate(colorSpace, components) autorelease];

答案 2 :(得分:3)

你做不到。自动释放池适用于侦听release消息的对象,CGColorRef不是这样的对象。

您可以通过执行

重写事物以返回UIColor
UIColor *ret = [UIColor colorWithCGColor:color]; // ret will be autoreleased
CGColorRelease(color);
return ret;

答案 3 :(得分:-3)

使用免费电话:

return [(UIColor *)color autorelease];

或者您可以使用+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha方法,然后执行return [myColor CGColor];