Эффективно модифицируя CGColor - PullRequest
2 голосов
/ 19 января 2012

У меня есть приложение для 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 ]

4 голосов
/ 19 января 2012

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

0 голосов
/ 19 января 2012

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

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

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

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

...