Утечка CGContextDrawImage - PullRequest
       7

Утечка CGContextDrawImage

2 голосов
/ 14 ноября 2009

У меня есть пользовательский вид, который рисует CGImage, используя:

- (void) drawImage
{
    CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
    CGRect imageRect = {{0,0}, {CGImageGetWidth(image), CGImageGetHeight(image)}};
    CGContextDrawImage(context, imageRect, image);
}

Похоже, что память, используемая процессом, постоянно увеличивается при изменении размера представления (и, таким образом, многократно вызывая drawImage). утечки показывает отсутствие утечки. vmmap действительно показывает увеличение памяти, но в области, находящейся вне прямого контроля моего приложения, т.е. растровые данные CG .

REGION TYPE           [ VIRTUAL after open]     [VIRTUAL after X resizes]
===========           [ =======]
ATS (font support)    [   31.7M]                [   31.7M]
CG backing stores     [   2448K]                [   5400K]
CG image              [     12K]                [     12K]
CG raster data        [    872K]                [   18.3M] <-- memory increase

Замена

CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];

с

CGContextRef context = (CGContextRef)[[NSGraphicsContext graphicsContextWithWindow:[self window]] graphicsPort];

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

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Это не похоже на утечку, вы, вероятно, просто увеличиваете размер кэша.Вы говорите, что он достигает пика в 50 МБ и, кажется, думаете, что это будет 50 МБ на документ, но это может быть просто 50 МБ на процесс.

0 голосов
/ 14 ноября 2009

Не для пренебрежительного отношения, но у вас действительно есть проблема здесь? С утечками все ясно, 18.3M - не очень большая виртуальная машина для растровых данных CG. Если вы достаточно долго измените размер окна, оно действительно будет использовать всю доступную память? Как вы это показали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...