Ich bin dabei, mein Projekt in ARC umzuwandeln. Ich habe eine Kategorie auf NSColor mit einer Methode, die eine Autoreleased CGColor Darstellung zurück:Convert-Methode, die eine automatisch freigegebene CGColor in ARC zurückgibt
@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
Was ist der richtige Weg, dies mit ARC zu tun? Ich möchte keine beibehaltene CGColor zurückgeben.
Der Konverter ARC in XCode empfehlen
return (CGColorRef)[(__bridge id)theColor autorelease];
verwenden, aber, dass die Ergebnisse in der folgenden Fehlermeldung:
[rewriter] es nicht sicher ist, zu 'CGColorRef' das Ergebnis zu werfen 'Autorelease'-Nachricht; ein __bridge Guss in einem Zeiger auf ein Objekt zerstört führen kann und ein __bridge_retained
das Objekt austreten Objekt
Sie haben hier ein ziemlich schönes Speicherleck. CGColorCreate erstellt ein CGColor-Objekt, das bei jedem Aufruf dieser Methode im Speicher gehalten wird. Ich empfehle sehr, etwas zu tun wie: 'CGColorRef colorRef = CGColorCreate (colorSpaceRGB, Komponenten); UIColor * retColor = [UIColor colorWithCGColor: colorRef]; CGColorRelease (colorRef); return retColor; ' – jfeldman
Haben Sie die Frage gelesen? Ich weiß, dass es undicht ist, das ist mein Problem. Ich wollte eine CGColor, keine UIColor (es ist sowieso eine OS X Frage, wie Sie durch meine Erwähnung von NSColor sagen konnten) zurückgeben. Jedenfalls wurde das vor einem halben Jahr beantwortet. – DrummerB