Эффективно модифицирующий 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)
чтобы предотвратить утечку. Посмотрите, как это помогает вашей производительности.