2012-01-19 4 views
2

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

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

Это код цвета «добавление»

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.

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

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

ответ

0

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

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

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

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

+0

Спасибо за ответ. Я освобождаю CGColor после того, как я назначил его контексту с CGContextSetStrokeColorWithColor (контекст, цвет). Это будет сделано то же самое, не так ли? Я не могу проверить ваше предложение сейчас, но позже. – Enigmoid

+0

Я не думаю, что могу отредактировать комментарий, но вы правы. Я пропускаю цвета, потому что метод, назначающий drawColor, происходит чаще, чем drawRect: где я отпускаю цвет. Спасибо что подметил это; Я собираюсь проверить это, когда у меня появится такая возможность. – Enigmoid

+0

Независимо от того, есть ли у вас или у кого-либо ответ на мой отредактированный вопрос, я нашел место для размещения своих CGColorReleases. Спасибо за помощь. – Enigmoid

4

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

+2

psst! Заметьте 'CGColorSpaceCreateDeviceRGB' тоже;) – justin

+0

Спасибо, Джастин. Я посмотрел, и теперь я выпускаю CGColorSpaceRef, который я выделял в режиме онлайн. Есть ли способ поддержать комментарии? – Enigmoid