web-dev-qa-db-fra.com

Avertissements concernant la mémoire de l'iPhone OS. Que signifient les différents niveaux?

Concernant l'art noir de la gestion de la mémoire sur les appareils iPhone OS: que signifient les différents niveaux d'avertissement de mémoire. Niveau 1? Niveau 2? Le cadran passe-t-il à 11?

Contexte: Après une longue période de test de stress mémoire - y compris l'exécution de mon application iPad avec l'application de lecture de musique iPod, je suis enclin à ignorer les avertissements de mémoire aléatoires mais peu fréquents que je reçois. Mon application jamais se bloque. Déjà. Mon application est sans fuite. Et bien, les avertissements mems ne semblent tout simplement pas avoir d'importance.

Merci,
Doug

85
dugla

Fondamentalement, les avertissements signifient que le périphérique manque de mémoire et que, "Si vous pouviez libérer de la mémoire, vous ne l'utilisez pas activement" d soit houle! ". Si votre gestion de la mémoire est serrée et que vous n'avez aucun objet qui pourrait pratiquement être jeté, passez simplement le message et ignorez-le.

97
Williham Totland

Les avertissements de niveau de mémoire sont enregistrés par SpringBoard. En tant que développeur d'applications, vous n'avez pas besoin de vous en soucier. Il suffit de répondre à -{application}didReceiveMemoryWarning.


Il existe 4 niveaux d'avertissements (0 à 3). Celles-ci sont définies à partir de l'observateur de mémoire du noyau et peuvent être obtenues par la fonction not-so-public-fonction OSMemoryNotificationCurrentLevel() .

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

La façon dont les niveaux sont déclenchés n'est pas documentée. SpringBoard est configuré pour effectuer les opérations suivantes dans chaque niveau de mémoire:

  1. Avertissement (non normal) - Relancez ou retardez la relance automatique des applications d'arrière-plan non essentielles, par exemple Courrier.
  2. Urgent - Quittez toutes les applications en arrière-plan, par ex. Safari et iPod.
  3. Critique et au-delà - Le noyau prendra le relais, tuant probablement SpringBoard ou même redémarrant.

La suppression de l'application active (jetsam) n'est pas gérée par SpringBoard, mais launchd.

193
kennytm

De OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

totoal 5 niveaux d'avertissement de mémoire (-1,3).

En ce qui concerne la description de l'avertissement de niveau de mémoire, la réponse de @ KennyTM est excellente.

Je veux ajouter plusieurs points connexes qui peuvent aider PM et autres.


Que devez-vous faire lorsque vous avez un avertissement de niveau de mémoire?

Lors de la réception de l'un de ces avertissements, votre méthode de gestion doit répondre en libérant immédiatement toute mémoire inutile. Par exemple, le comportement par défaut de la classe UIViewController consiste à purger sa vue si cette vue n'est pas actuellement visible; les sous-classes peuvent compléter le comportement par défaut en purgeant des structures de données supplémentaires. Une application qui conserve un cache d'images peut répondre en libérant toutes les images qui ne sont pas actuellement à l'écran.


Comment observer l'avertissement de niveau de mémoire?

De http://developer.Apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

Lorsque le système envoie un avertissement de mémoire insuffisante à votre application, répondez immédiatement. iOS avertit toutes les applications en cours d'exécution chaque fois que la quantité de mémoire libre descend en dessous d'un seuil sûr. (Il ne notifie pas les applications suspendues.) Si votre application reçoit cet avertissement, elle doit libérer autant de mémoire que possible. La meilleure façon de procéder consiste à supprimer les références fortes aux caches, objets image et autres objets de données qui peuvent être recréés ultérieurement.

UIKit propose plusieurs façons de recevoir des avertissements de mémoire insuffisante, notamment:

  • Implémentez la méthode applicationDidReceiveMemoryWarning: de votre délégué d'application.
  • Remplacez la méthode didReceiveMemoryWarning dans votre sous-classe UIViewController personnalisée.
  • Inscrivez-vous pour recevoir la notification UIApplicationDidReceiveMemoryWarningNotification.

Comment réduire l'empreinte mémoire de votre application?

  • Éliminez les fuites de mémoire.
  • Faites des fichiers de ressources aussi petits que possible.
  • Utilisez Core Data ou SQLite pour les grands ensembles de données.
  • Chargez les ressources paresseusement.
  • Créez votre programme en utilisant l'option Thumb.

Détails sur http://developer.Apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


Comment allouer judicieusement la mémoire?

  • Réduisez votre utilisation d'objets libérés automatiquement: Avec le comptage automatique de références (ARC), il est préférable d'allouer/initialiser des objets et de laisser le compilateur les libérer pour vous au moment approprié. Cela est vrai même pour les objets temporaires que vous auriez pu autoriser dans le passé pour les empêcher de vivre au-delà de la portée de la méthode actuelle.
  • Imposer des limites de taille aux ressources: Évitez de charger un gros fichier de ressources quand un plus petit fera l'affaire. Au lieu d'utiliser une image haute résolution, utilisez-en une de taille appropriée pour les appareils iOS. Si vous devez utiliser des fichiers de ressources volumineux, trouvez des moyens de charger uniquement la partie du fichier dont vous avez besoin à un moment donné. Par exemple, plutôt que de charger l'intégralité du fichier en mémoire, utilisez les fonctions mmap et munmap pour mapper des parties du fichier dans et hors de la mémoire. Pour plus d'informations sur le mappage de fichiers en mémoire.
  • Évitez les ensembles de problèmes illimités: Les ensembles de problèmes illimités peuvent nécessiter une quantité de données arbitrairement élevée pour le calcul. Si l'ensemble nécessite plus de mémoire que ce qui est disponible, votre application peut ne pas être en mesure de terminer les calculs. Vos applications doivent éviter ces ensembles dans la mesure du possible et résoudre les problèmes avec des limites de mémoire connues.
12
Md Mahbubur Rahman