2010-08-17 12 views
5

Ho un metodo che restituisce l'istanza CGColorRef creata dal metodo CGColorCreate. Ho bisogno di autorelease il ritorno del colore da questo metodo. Qualcuno sa come fare questo?Come 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

Pedante: si dovrebbe solo nominare un metodo che inizia con 'get' se ci vogliono i puntatori da compilare come argomenti. Un nome migliore qui sarebbe '+ (CGColorRef) CGColorWithRed: (int) rosso verde: (int) verde blu: (int) blu alfa: (int) alfa' (seguendo il comando dei metodi' NSColor'/'UIColor'). – Wevah

risposta

13

Non è possibile direttamente, come hanno detto i produttori. Anche UIColor e CGColorRef sono non senza ponte - perché il convertitore funziona quindi? Tuttavia (e mentre Non consiglio esso - utilizzare UIColor invece!) C'è un trucco per farlo:

Creare un autoreleased oggetto UIColor e tornare è CGColor. In questo modo:

return [UIColor colorWith... ].CGColor; 

Ciò restituirà un oggetto CGColorRef regolare che è legato alla sua UIColor. Ciò significa che se lo UIColor viene rilasciato nel ciclo di autorelease, verrà rilasciato anche lo CGColorRef, a meno che non sia stato conservato da qualche altra parte utilizzando uno CGRetain(...), che il chiamante del metodo avrebbe dovuto eseguire se voleva mantenere il colore. In quanto tale il CGColorRef è pseudo-autoreleased ...

Ancora: Vorrei non consiglia di farlo. Usa UIColor direttamente!

+0

Anche se devo ammettere che questo è abbastanza geniale, introduce (possibilità di) bug che sono quasi impossibili da trovare nel tuo codice tra 6 mesi a partire da ora. – mvds

+0

giusto, questo è il motivo per cui non consiglio di usarlo. –

3

Non è possibile. I pool Autorelease funzionano sugli oggetti che ascoltano il messaggio release e un CGColorRef non è un tale oggetto.

Si potrebbe riscrivere le cose per restituire un UIColor, facendo

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

In un programma Cocoa, un CGColorRef è un oggetto Cocoa che implementa il protocollo NSObject. È perfettamente sicuro inserirlo in una piscina autorelease. –

+1

Sembra interessante. Hai un puntatore alla documentazione che supporta questo? – mvds

6

Si può fare questo:

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

Usa numero verde ponte:

return [(UIColor *)color autorelease]; 

oppure si può utente + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha metodo e quindi fare return [myColor CGColor];

+3

UIColor e CGColorRef non sono documentati come bridge senza pedaggio. Puoi usare + colorWithCGColor: per convertire in un UIColor. – JeremyP

+0

Siamo spiacenti, hai ragione. – beefon

Problemi correlati