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
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.
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:
La suppression de l'application active (jetsam) n'est pas gérée par SpringBoard, mais launchd
.
/*
** 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?
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:
Comment réduire l'empreinte mémoire de votre application?
Comment allouer judicieusement la mémoire?