如何自动释放 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 所说,您不能直接使用。还有UIColor
和CGColorRef
是不是免工具桥接的——为什么转换器会起作用呢?然而(虽然我不推荐它——改用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的主要内容,如果未能解决你的问题,请参考以下文章