2010-08-17 40 views
5

我有一個返回由CGColorCreate方法創建CGColorRef實例的方法。我需要從這個方法autorelease顏色返回。有誰知道如何做到這一點?如何自動釋放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; 
} 
+5

迂腐:如果它需要待填寫的指針作爲一個參數應該只名稱以'GET'的方法。這裏一個更好的名字是'+(CGColorRef)CGColorWithRed:(INT)紅綠:(INT)藍綠色:(INT)藍阿爾法:(INT)alpha'(以下的'NSColor' /'UIColor'方法鉛)。 – Wevah 2010-08-17 12:26:35

回答

13

你不能直接作爲MVDS說。此外UIColorCGColorRef免工具橋 - 爲什麼轉換器的功能呢?但是(同時我不建議它 - 用UIColor代替!)有一招可以這樣做:

創建自動釋放的UIColor對象,並返回它的CGColor。像這樣:

return [UIColor colorWith... ].CGColor; 

這將返回綁定到它的UIColor定期CGColorRef對象。這意味着,如果UIColor在自動釋放環被釋放,這是CGColorRef將被釋放,以及 - 除非它一直保留在其他地方使用CGRetain(...),你的方法的調用者應該做的,如果它想保留的顏色。因此CGColorRef是僞自動釋放...

仍然:我會不是建議這樣做。直接使用UIColor!

+0

雖然我必須承認這非常巧妙,但它引入了從現在起6個月內在自己的代碼中幾乎不可能找到的錯誤的機會。 – mvds 2010-08-17 21:29:45

+0

沒錯,這就是我不推薦使用它的原因。 – 2010-08-23 10:57:17

3

你不能。自動釋放池在收聽release消息的對象上工作,而CGColorRef不是這樣的對象。

你可以重寫的東西返回一個UIColor,做

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

在Cocoa程序中,CGColorRef是一個實現NSObject協議的Cocoa對象。將一個放入autorelease池是完全安全的。 – 2011-12-21 17:31:00

+1

聽起來很有意思。你有指向文檔的指針嗎? – mvds 2011-12-21 18:29:53

6

你可以這樣做:

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

使用免費電話橋:

return [(UIColor *)color autorelease]; 

或者你可以用戶+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha方法然後做return [myColor CGColor];

+3

UIColor和CGColorRef未記錄爲免費橋接。您可以使用+ colorWithCGColor:來轉換爲UIColor。 – JeremyP 2010-08-17 12:37:17

+0

對不起,你是對的。 – beefon 2010-08-17 20:49:31