2009-11-14 2 views
2

У меня есть настраиваемое представление, что рисует CGImage с помощью:CGContextDrawImage утечка

- (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]; 

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

Как это исправить?

ответ

0

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

+0

Он достигает максимума около 50 МБ, а затем он падает. При использовании многодокументного приложения добавляется 50 Мб на документ. При использовании графического контекста окна растровые данные никогда не превышают 128K. – diciu

+0

Я не могу воссоздать его на 10.6.2. Вы должны добавить некоторую информацию о версии osx к своему сообщению - может кому-то помочь. – 2009-11-15 10:29:01

1

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

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