Внезапный всплеск памяти при использовании пользовательского интерфейса для cgcontextset fillcolorwithcolor

#iphone #ios #cocoa-touch #uikit #core-graphics

#iPhone #iOS #cocoa-touch #uikit #ядро-графика

Вопрос:

Я использую изображение для заливки цвета в текущем графическом контексте, используя следующее утверждение:

 CGContextSetFillColorWithColor(aContext,[[UIColor colorWithPatternImage:[UIImage imageNamed:kRunnerGradientedBackgroundImage]] CGColor]);
 

Это утверждение внезапно увеличивает использование моей памяти с 1,3 МБ до 5,6 МБ. Если я отпущу UIImage объект, он уменьшится до 1,3 МБ, но поскольку количество сохраняемых объектов изображения уже равно 0, я не могу этого сделать.

Есть предложения, как контролировать этот внезапный всплеск памяти?

Комментарии:

1. хм, @autoreleasepool { YOUR CODE GOES HERE } ?

2. автозапуск также не помогает. Он сохраняет память с высоким значением.

Ответ №1:

Для его использования данные шаблона должны быть загружены в память. Обойти это невозможно. Вы могли бы попробовать меньший шаблон. Также попробуйте вернуть цвет заливки для вашего контекста к простому сплошному цвету, когда закончите рисовать с помощью шаблона.

ДОБАВЛЕНО: Также возможно, что сам графический контекст становится намного больше, когда вы добавляете в него шаблон или изображение (чтобы вместить все пиксели, необходимые для шаблонного изображения). Попробуйте удалить и освободить UIView или CGLayer, содержащие графический контекст.

Комментарии:

1. Попытался сбросить цвет заливки обратно на [[UIColor clearColor] CGColor], но это не помогает.

Ответ №2:

Насколько велик kRunnerGradientedBackgroundImage и в каком формате он находится? Если PNG, есть ли у него ненужный альфа-канал? Как упоминалось в hotpaw2, изображение шаблона должно быть как можно меньше, которое UIKit затем обработает для вас. Можете ли вы уменьшить размер с помощью PNGCRUSH?

Другой подход заключается в использовании CGGradient или CAGradientLayer программном создании градиента с помощью CoreGraphics / CoreAnimation.

См.:

Ответ №3:

Я удалил изображение и теперь рисую градиент с помощью кода. Это уменьшило скачок памяти на 4,5 МБ.