1

Lorsque j'essaie d'envoyer des images en tant que pièces jointes (taille résumée ~ 4 Mo) en utilisant MFMailCompose, le moniteur d'activité indique quelle mémoire de 100 (+ - 2) Mo est utilisée. Après l'envoi ou l'annulation de la mémoire est libère ~ 20 mégaoctets, mais ce qui est arrivé aux 80 mégaoctets restants si l'élément partagé avec des images est libéré? Merci! :)MFMailComposeViewController utilise trop de mémoire

Répondre

4

La taille du fichier d'une image et la quantité de mémoire qu'elle consomme lorsqu'elle est affichée sont deux choses complètement différentes.

Les images telles que JPEG et PNG sont compressées. Quand ils sont attirés à l'écran, ils ne sont pas compressés.

Une règle rapide de pouce pour trouver la quantité de mémoire une image consommera lors de l'affichage est

memory consumed = (width * height) * 4 

exemple, une image qui est de 2 Ko sur le disque, mais est de 62 x 52 pixels consommeront effectivement 12896 octets ou 12 Ko. J'imagine qu'une image de 4 Mo sur un disque consommera plus de 4 Mo. Le problème est que MFMailComposer affiche les images dans sa vue composer lorsque vous les ajoutez en tant que pièces jointes et que, par conséquent, elles sont décompressées et consomment de la mémoire. Ainsi, vos 4 Mo d'images consomment beaucoup plus que ce que vous pensez.

Essayez peut-être d'envoyer une seule image à la fois. Vous devez également être conscient que vous libérez les images et le MFMailComposeViewController lorsque vous en avez fini avec eux, ou que ce serait sûrement la source de la fuite.

Sachez également comment vous chargez initialement vos images. UIImageimageNamed: méthode met en réalité des images en cache. Les images mises en cache ne sont purgées que dans des situations où la mémoire est insuffisante. Elles peuvent donc rester en attente pendant un certain temps si vous ne respectez pas les limites.

Enfin, vous avez remarqué que vous observez la consommation de mémoire dans Instruments, mais avez-vous vérifié qu'il s'agit effectivement d'un problème? Vous rencontrez des plantages d'applications en raison de la mémoire insuffisante lors du test de votre application alors que n'est pas connecté à Instruments ou au débogueur?

Aucun corps n'est parfait - et cela vaut aussi pour Apple. Il y a eu des cas documentés dans le passé où les cadres d'Apple ont montré des fuites de mémoire (la mise en cache de UIImage a fui dans iOS 2.x), mais je ne serais pas si prompts à blâmer les frameworks quand vous remarquerez un pic de consommation de mémoire. Si l'instrument de fuite ne montre aucune fuite et que l'analyseur ne montre aucun problème, le scénario le plus probable est qu'il s'agit simplement d'une consommation de mémoire et non d'une fuite.

Il est important de se rappeler que les appareils iOS ne disposent pas de gigaoctets de RAM comme les ordinateurs. Vous devez être prudent avec la mémoire que vous utilisez. Si cela signifie ne pas envoyer XX Mo d'images en même temps, alors c'est comme ça que ça doit être.

Questions connexes