35 votes

IOS Crash mémoire faible, mais utilisation de mémoire très faible

Cela me dérange depuis longtemps. Mon application fonctionne en utilisant environ 2,74 Mo de mémoire. C'est bien. Mais ensuite, quand elle crée un UIWebView, cela monte à environ 5,87 Mo et finit par planter. Ce sont les valeurs données sous Live Bytes dans Instruments en cours d'exécution sur mon iPad de 1ère génération.

Je ne trouve aucun journal des plantages. Voici ce qui s'affiche dans la console :

MyApp[1205]  : Avertissement de mémoire reçu. Niveau = 1
MyApp[1205]  : applicationDidReceiveMemoryWarning
SpringBoard[30]  : Avertissement de mémoire reçu. Niveau = 1
MobileMail[1199]  : Avertissement de mémoire reçu. Niveau = 1
configd[26]  : jetsam: événement de mémoire du noyau (95), libre : 428, actif : 1853, inactif : 1011, purgable : 338, câblé : 15122
configd[26]  : jetsam: création de cliché de terminaison du noyau
com.apple.launchd[1]  : (UIKitApplication:com.apple.mobilemail[0x8966]) Exited: Killed: 9
com.apple.launchd[1]  : (UIKitApplication:com.MyApp.MyApp[0xdd4f]) Exited: Killed: 9
SpringBoard[30]  : L'application 'Mail' a quitté de manière anormale avec le signal 9 : Killed: 9
kernel[0]  : launchd[1207] Profil intégré: MobileMail (bac à sable)
SpringBoard[30]  : L'application 'MyApp' a quitté de manière anormale avec le signal 9 : Killed: 9
configd[26]  : CaptiveNetworkSupport:UIAllowedNotifyCallback:70 uiallowed: false
ReportCrash[1206]  : libMobileGestalt loadBasebandMobileEquipmentInfo : erreur CommCenter : 1:45
ReportCrash[1206]  : libMobileGestalt copyInternationalMobileEquipmentIdentity : Impossible d'obtenir le dictionnaire d'informations sur l'équipement mobile
ReportCrash[1206]  : Rapport de plantage enregistré sous /Library/Logs/CrashReporter/LowMemory-2011-05-12-160645.plist en utilisant l'uid : 0 gid : 0, euid synthétique : 0 egid : 0

J'ai supprimé tous les appels à imageNamed, changé les éléments autoreleased en alloc/release. Mais je n'arrive pas à comprendre pourquoi cela se produit et cela me rend fou.

Merci pour toute aide !

51voto

Ethical Paul Points 666

Vous utilisez presque certainement beaucoup plus de mémoire que vous ne le pensez.

Il n'est pas évident de savoir ce que vous devez faire pour voir ce que votre application utilise réellement, mais une fois que vous l'aurez fait plusieurs fois, vous vous en souviendrez.

  1. Exécutez l'outil de performance des allocations.
  2. Cliquez sur la "ligne" VM Tracker sous "Allocations" (dans la capture d'écran)
  3. Cliquez sur "Capture automatique"

Ensuite, vous verrez votre mémoire "Dirty" (actuellement 20,34 Mo dans ma capture d'écran).

Cela devrait vous donner une bien meilleure idée de la raison pour laquelle votre application se ferme. Vous avez probablement une fuite de mémoire importante.

Bonne chance!

Cette capture d'écran vous aidera

22voto

Felz Points 5989

J'ai deux choses à ajouter qui pourraient aider :

  1. Comme mentionné dans une réponse précédente ici , le bitmap d'une UIImage n'est pas pris en compte dans la quantité de fuites mémoire que votre application utilise, donc vous pourriez avoir beaucoup d'UIImages qui utilisent beaucoup de mémoire mais qui n'apparaissent pas dans le total. Ma recommandation est d'utiliser Allocations pour vérifier le nombre d'objets UIImage créés et détruits pendant l'exécution de votre application.
  2. Comme mentionné dans cette réponse, utilisez le code suivant

    -(void) report_memory {
        struct task_basic_info info;
        mach_msg_type_number_t size = sizeof(info);
        kern_return_t kerr = task_info(mach_task_self(),
                                       TASK_BASIC_INFO,
                                       (task_info_t)&info,
                                       &size);
        if( kerr == KERN_SUCCESS ) {
            NSLog(@"Mémoire utilisée (en octets) : %u", info.resident_size);
        } else {
            NSLog(@"Erreur avec task_info() : %s", mach_error_string(kerr));
        }
    }

pour voir la quantité de mémoire que le système d'exploitation a attribuée à votre application. C'est un chiffre plus précis sur la mémoire utilisée par votre application. (Vous devrez importer "mach/mach.h")

À votre santé !

-5voto

ForgeGaming Points 5

Si vous appuyez rapidement 2 fois sur ce bouton de menu, vous verrez l'application, cliquez sur la croix pour toutes les applications, puis ouvrez celles dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X