Эффективно модифицирующий CGColor

У меня есть приложение для iPhone, где я "добавляю" множество CGColors вместе, разбивая их на компоненты, усредняя компоненты, а затем делая новый цвет с новыми компонентами. Когда я запускаю этот код, Instruments обнаруживает, что у меня много CGColors, и приложение работает медленно.

Я чувствую, что мог бы решить проблему утечки памяти, если бы был способ сделать то, что я делаю, без использования CGColorCreate (colorspace, компоненты) каждый раз.

Это код для цвета "добавление"

const CGFloat *cs=CGColorGetComponents(drawColor);
const CGFloat *csA=CGColorGetComponents(add->drawColor);
CGFloat r=(cs[0]*w+csA[0]*aW)/1;
CGFloat g=(cs[1]*w+csA[1]*aW)/1;
CGFloat b=(cs[2]*w+csA[2]*aW)/1;
CGFloat components[]={r, g, b, 1.f};
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);

Любая помощь будет очень признательна, даже если она поможет "добавлять цвета реже". Я уверен, что я не единственный человек, пытающийся изменить CGColors.

РЕДАКТИРОВАТЬ: Итак, комментарий Роба поставил меня на правильный путь, но я получаю malloc дважды свободные ошибки, потому что метод с добавлением цвета вызывается несколько раз, прежде чем назначается новый drawColor. Есть ли способ проверить, существует ли drawColor, прежде чем я его выпущу? Вот новый соответствующий код.

CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGColorRelease(drawColor);
drawColor=CGColorCreate(colorSpace, components);
CGColorSpaceRelease(colorSpace);

2 ответа

Решение

Если вы протекаете CGColor объекты, первым шагом к решению вашей проблемы является прекращение их утечки. Вам нужно позвонить CGColorRelease когда вы закончите с цветным объектом. Например, вы явно утечка drawColor объект в вашем примере кода. Вы должны делать это:

CGColorRelease(drawColor);
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);

освободить старый объект, на который ссылается drawColor прежде чем назначить новый объект drawColor,

CGColor объекты неизменны, поэтому вы не сможете просто изменить существующие объекты.

Уверен, что вам просто нужно CGColorRelease(drawColor) чтобы предотвратить утечку. Посмотрите, как это помогает вашей производительности.

Другие вопросы по тегам