如何自动释放 CGColorRef

Posted

技术标签:

【中文标题】如何自动释放 CGColorRef【英文标题】:How to autorelease CGColorRef 【发布时间】:2010-08-17 10:21:09 【问题描述】:

我有一个方法返回由 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;

【问题讨论】:

Pedantic:如果将要填充的指针作为参数,则只应命名以 get 开头的方法。这里更好的名称是+ (CGColorRef)CGColorWithRed:(int)red green:(int)green blue:(int)blue alpha:(int)alpha(遵循NSColor/UIColor 方法)。 【参考方案1】:

正如 mvds 所说,您不能直接使用。还有UIColorCGColorRef不是免工具桥接的——为什么转换器会起作用呢?然而(虽然我不推荐它——改用UIColor!)这样做有一个技巧:

创建一个autoreleased UIColor 对象并返回它的CGColor。像这样:

return [UIColor colorWith... ].CGColor;

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

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

【讨论】:

虽然我必须承认这非常巧妙,但它引入了(出现)错误,这些错误在 6 个月后几乎不可能在您自己的代码中找到。【参考方案2】:

你可以这样做:

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

【讨论】:

【参考方案3】:

你不能。自动释放池对监听release 消息的对象起作用,而CGColorRef 不是这样的对象。

你可以重写一些东西来返回UIColor,通过这样做

UIColor *ret = [UIColor colorWithCGColor:color]; // ret will be autoreleased
CGColorRelease(color);
return ret;

【讨论】:

在 Cocoa 程序中,CGColorRef 是实现 NSObject 协议的 Cocoa 对象。将一个放在自动释放池中是非常安全的。 听起来很有趣。你有指向支持这一点的文档的指针吗?【参考方案4】:

使用免费桥:

return [(UIColor *)color autorelease];

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

【讨论】:

UIColor 和 CGColorRef 未记录为免费桥接。您可以使用 +colorWithCGColor: 转换为 UIColor。

以上是关于如何自动释放 CGColorRef的主要内容,如果未能解决你的问题,请参考以下文章

iOS自动释放池_原理_如何工作

oracle连接数如何自动自动释放

如何自动释放 CGColorRef

如何耗尽当前的自动释放池?

如何管理自动释放对象的内存

【delphi线程】 如何自动释放?