2009-11-14 4 views
0

У меня есть метод, который анализирует данные пикселей внутри NSBitmapImageRep, который построен из CGImageRef. Вот соответствующий код:Огромная утечка памяти в NSBitmapImageRep

CGImageRef ref; 
// omitted code for initializing ref 
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:ref]; 
uint32* bitmapPixels = (uint32*) [bitmapRep bitmapData]; 
// do stuff with bitmapPixels 
[bitmapRep release]; 
CGImageRelease(ref); 

Я знаю, что я правильно отпуская CGImageRef и NSBitmapImageRep, но вызов -bitmapData утечки примерно в 2 Мб каждый раз, когда это называется, и я не знаю, как правильно освободить Это. Есть идеи?

Обновление: Я забыл добавить один важный момент: память только просочилась, когда работает полноэкранное приложение. Для регулярного использования память выдается просто отлично.

+1

Быстрый просмотр ссылки указывает на то, что -bitMapData просто возвращает указатель на данные в объекте bitmapRep и поэтому не нужно его выпускать. Можете ли вы включить сборку мусора и посмотреть, что произойдет потом? Это может дать вам некоторые подсказки. –

+0

Решение @Tony Ken, кажется, выпускает данные, как только вы закончите с ним. Без пула, похоже, что Mac просто выпускает эти данные всякий раз, когда захочет. – pop850

ответ

0

Данные растрового изображения должны принадлежать либо CGImage, либо NSBitmapImageRep (или копируются в объект NSData с автореализацией за кадром). Таким образом, какой бы объект ни владел (или копиями), он должен его освободить.

Вы видите противоположные результаты в куче/приборах?

3

Вы делаете это в цикле? Если это так, вам может понадобиться создать автозапуск, чтобы убедиться, что память очищена своевременно. См. autorelease pools.

+0

У меня была аналогичная проблема с тем, о котором спрашивал Ник, и это решение было совершенным. Благодаря! – pop850

+0

Я зацикливал изображения, иногда на 200+ 5 Мбайт + CIImages и NSBitmapImageReps за раз, а использование памяти достигло пика около 2-3 ГБ (плюс система стала бы довольно медленной). Добавление @autoreleasepool {} вокруг цикла сократило использование пиковой памяти до ~ 180 МБ и сделало пакетный процесс за несколько секунд вместо 1-2 минут! – geerlingguy

Смежные вопросы