2012-11-06 1 views
3

Mon application s'exécute dans Instruments en prenant environ 700 Ko de Live Bytes en moyenne en cours d'exécution. Cependant, chaque fois qu'il charge une nouvelle image en plein écran, les allocations de mémoire sautent d'environ 10 Mo pendant une seconde, puis récupèrent au niveau normal de 700 Ko. Ceci est correct au début, mais une fois qu'il est arrivé plusieurs fois je reçois des avertissements de mémoire et l'application se ferme, même si le total des octets de vie se stabilise bien sous la marque de 1 Mo.Chargement de l'image Retina en plein écran sur l'iPad provoque un pic massif de 10 Mo

J'ai créé un projet de test pour voir pourquoi cela se produit. Il est une application simple avec seulement le code suivant dans le contrôleur Vue:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *imgFile = [[NSBundle mainBundle] pathForResource:@"00-bg" ofType:@"png"]; 
    UIImage *img = [[UIImage alloc] initWithContentsOfFile:imgFile]; 

    UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:img]; 
    [img release]; 

    [self.view addSubview:backgroundImageView]; 
    [backgroundImageView release]; 
} 

La sortie des instruments (Fuites) ressemble à ceci: output from Instruments

J'ai essayé à la fois ARC et non-ARC, et la seule différence est la longueur de la pointe (ARC semble retenir plus longtemps la mémoire). J'ai également essayé UIImage imageNamed: et initWithContentsOfFile: mais les résultats sont les mêmes.

Pourquoi cette pointe se produit-elle? Et y a-t-il quelque chose que je puisse faire pour l'éviter?

+0

Je ne suis pas sûr que ce soit possible, allez-vous s'il vous plaît essayer de passer par l'arbre d'appel jusqu'à l'allocation et spécifier la fonction qui cause réellement les pointes? –

+0

Malheureusement, je ne peux pas trouver le pic dans l'arbre d'appel parce qu'il est déjà parti avant que je puisse vérifier. – jowie

Répondre

3

Pour les afficher à l'écran, iOS doit décompresser vos images et c'est de là que provient votre pic.

2048 * 1536 = 3145728 pixels. À 4 octets par pixel, soit 12 Mo.

+2

Vous devez également noter que cette utilisation de la mémoire reste visible, mais peut être masquée par l'outil Allocations (les textures OpenGL ES et d'autres éléments visuels peuvent ne pas apparaître dans les allocations). Vous devez utiliser Memory Monitor pour afficher la véritable taille totale de la mémoire de votre application. –

+0

Merci, je vais le faire. Il s'avère dans mon application principale, l'utilisation de 'UIImage imageNamed:' provoquait une fuite de mémoire. Ainsi, lorsque le système d'exploitation nécessitait 10 Mo pour la décompression d'image, il n'aurait pas assez de mémoire pour le faire. J'ai remplacé toutes les instances par 'initWithContentsOfFile:' et bien que les pics soient toujours là, l'application ne se bloque plus. – jowie

+1

Je dirais que puisque l'exigence de mémoire de décompression est légèrement inférieure à 10 Mo, ces images particulières ne doivent requérir que 3 octets par pixel car elles n'ont pas de canal alpha :) – jowie

Questions connexes