2009-11-14 7 views
2

J'ai une vue personnalisée qui tire un CGImage en utilisant:CGContextDrawImage fuite

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

Il ressemble à la mémoire utilisée par le processus augmente de façon constante lors du redimensionnement de la vue (et donc appelant à plusieurs reprises drawImage). fuites ne montre aucune fuite. vmmap montre en effet une augmentation de la mémoire, mais dans une zone qui est en dehors du contrôle direct de ma demande, c'est-à-dire CG données de trame.

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 

Remplacement

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

avec

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

fait la fuite aller loin, mais les résultats dans la fenêtre plus lente redessine et artefacts visuels.

Comment puis-je résoudre ce problème?

Répondre

0

Pour ne pas être dédaigneux mais avez-vous vraiment un problème ici? Les fuites sont toutes claires, 18.3M n'est pas très VM pour les données raster CG. Si vous redimensionnez la fenêtre assez longtemps, cela consomme-t-il vraiment toute la mémoire disponible? Comment l'avez-vous montré?

+0

Il pics à environ 50Mb puis il descend. Avec une application multi-document 50 Mo par document ajoute. Lors de l'utilisation du contexte graphique de la fenêtre, les données raster ne dépassent jamais 128 Ko. – diciu

+0

Je ne peux pas le recréer sur 10.6.2. Vous devriez ajouter quelques informations sur la version osx à votre message - pourrait aider quelqu'un. –

1

Cela ne semble pas être une fuite, vous augmentez probablement la taille d'un cache. Vous dites qu'il atteint un maximum de 50 Mo et semble penser que ce sera 50 Mo par document, mais ce pourrait être simplement 50 Mo par processus.