Sono in procinto di convertire il mio progetto in ARC. Ho una categoria a NSColor con un metodo che restituisce una rappresentazione CGColor autoreleased:Metodo di conversione che restituisce un CGColor con autoreleased su ARC
@implementation NSColor (MyCategory)
- (CGColorRef)CGColor
{
NSColor *colorRGB = [self colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
CGFloat components[4];
[colorRGB getRed:&components[0]
green:&components[1]
blue:&components[2]
alpha:&components[3]];
CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGColorRef theColor = CGColorCreate(space, components);
CGColorSpaceRelease(space);
return (CGColorRef)[(id)theColor autorelease];
}
@end
Qual è il modo corretto di fare questo con ARC? Non voglio restituire un CGColor conservato.
Il convertitore ARC in XCode consigliamo di usare
return (CGColorRef)[(__bridge id)theColor autorelease];
ma che provoca il seguente messaggio di errore:
[masterizzatore] non è sicuro di gettare a 'CGColorRef' il risultato di messaggio 'autorelease'; un cast __bridge può comportare un puntatore a un oggetto distrutto e __bridge_retained può perdere l'oggetto
Hai una bella perdita di memoria qui. CGColorCreate creerà un oggetto CGColor che ogni volta che chiamerai questo metodo verrà tenuto in memoria. Consiglio vivamente di fare qualcosa del tipo: 'CGColorRef colorRef = CGColorCreate (colorSpaceRGB, componenti); UIColor * retColor = [UIColor colorWithCGColor: colorRef]; CGColorRelease (colorRef); return retColor; ' – jfeldman
Hai letto la domanda? So che sta perdendo, questo è il mio problema. Volevo restituire un CGColor, non un UIColor (è comunque una domanda OS X come si potrebbe dire dalla mia citazione di NSColor). Ad ogni modo, questo è stato risolto sei mesi fa. – DrummerB