Как сделать авто-релиз CGColorRef - PullRequest
5 голосов
/ 17 августа 2010

У меня есть метод, который возвращает экземпляр CGColorRef, созданный методом CGColorCreate.Мне нужно автоматически выпустить возврат цвета из этого метода.Кто-нибудь знает как это сделать?

//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;
}

Ответы [ 4 ]

13 голосов
/ 17 августа 2010

Вы не можете напрямую, как сказал mvds. Кроме того, UIColor и CGColorRef не не мост без инструментов - почему тогда работает преобразователь? Однако (и хотя я не рекомендую это - используйте UIColor вместо этого!) Для этого есть хитрость:

Создайте автоматически выпущенный объект UIColor и верните его CGColor. Вот так:

return [UIColor colorWith... ].CGColor;

Это вернет обычный объект CGColorRef, связанный с ним UIColor. Это означает, что если UIColor будет освобожден в цикле автоматического выпуска, он будет также освобожден CGColorRef - если только он не был сохранен где-то еще с использованием CGRetain(...), что должен был сделать вызывающий вашего метода, если он хотел сохранить цвет. Таким образом, CGColorRef является псевдоавтомобилем ...

Тем не менее: я бы не рекомендовал сделать это. Используйте UIColor напрямую!

6 голосов
/ 17 августа 2010

Вы можете сделать это:

CGColorRef color = (CGColorRef)[(id)CGColorCreate(colorSpace, components) autorelease];
3 голосов
/ 17 августа 2010

Вы не можете.Пулы автоматического освобождения работают с объектами, слушающими сообщение release, а CGColorRef не является таким объектом.

Вы можете переписать вещи, чтобы вернуть UIColor, выполнив

UIColor *ret = [UIColor colorWithCGColor:color]; // ret will be autoreleased
CGColorRelease(color);
return ret;
0 голосов
/ 17 августа 2010

Используйте бесплатный мост:

return [(UIColor *)color autorelease];

Или вы можете использовать метод + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha, а затем сделать return [myColor CGColor];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...