85 votes

iPhone OS mémoire avertissements. Que signifient les différents niveaux ?

Concernant le noir de l'art de la gestion de la mémoire de l'iPhone OS appareils: a quoi correspondent les différents niveaux de mémoire avertissement veux dire. Niveau 1? Niveau 2? Le cadran aller à 11?

Contexte: Après une longue mémoire le stress de la période de test - y compris l'exécution de mon application iPad avec l'iPod application lecteur de musique à jouer, je suis enclin à ignorer le hasard encore peu fréquents avertissements de mémoire je suis à la réception. Mon application ne jamais se bloque. Jamais. Mon application est sans fuite. Et, ainsi, le mems avertissements ne semblent tout simplement pas question.

Merci,
Doug

193voto

KennyTM Points 232647

Niveau de la mémoire avertissements enregistrés par Tremplin. Comme un développeur d'application, vous n'avez pas besoin de s'en soucier. Simplement de répondre à l' -{application}didReceiveMemoryWarning est suffisant.


Il existe 4 niveaux de mise en garde (de 0 à 3). Ceux-ci sont définis à partir de la mémoire du noyau de l'observateur, et peut être obtenu par la pas-si-à la fonction publique, OSMemoryNotificationCurrentLevel().

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

Comment les niveaux sont déclenchées n'est pas documentée. Tremplin est configuré pour effectuer les opérations suivantes dans chaque niveau de la mémoire:

  1. Avertissement (pas normal) - Relancer ou de retard de l'auto relance de non essentiels de fond apps Mail par exemple.
  2. Urgent - Quittez toutes les applications d'arrière-plan, par exemple, Safari et iPod.
  3. Critique et au - delà- Le noyau va prendre le dessus, probablement tuer Tremplin ou même redémarrer.

Tuer l'application active (jetsam) n'est pas géré par Tremplin, mais launchd.

98voto

Williham Totland Points 15798

Fondamentalement les avertissements signifient que l' appareil est insuffisant sur la mémoire et que, « si vous pourriez s’il vous plaît quelques mémoire libre vous n’êtes pas activement l’utilisation qui serait enfler !». Si votre gestion de la mémoire est serrée et que vous n’avez aucun objet qui pourrait pratiquement être mis au rebut, juste passer le message et l’ignorer.

12voto

De OSMemoryNotification.h,

/*
** Threshold values for notifications
*/

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

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

Sujet de Mémoire avertissement de Niveau de description, @KennyTM la réponse est excellente.

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


Que devez-vous faire lorsque, ayant Mémoire Avertissement de Niveau?

Dès la réception de ces avertissements, votre gestionnaire de méthode doit répondre immédiatement en libérant de toute inutiles de la mémoire. Par exemple, le comportement par défaut de la classe UIViewController est de purger son point de vue, si ce point de vue n'est pas actuellement visible; les sous-classes peuvent compléter le comportement par défaut par la purge supplémentaire des structures de données. Une application qui maintient un cache des images peuvent réagir en libérant toutes les images qui ne sont pas actuellement à l'écran.


Comment observer le Niveau de Mémoire avertissement?

À partir de http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

Lorsque le système distribue un peu de mémoire avertissement à votre application, répondre immédiatement. iOS en informe toutes les applications en cours d'exécution à chaque fois que la quantité de mémoire libre descend en dessous d'un seuil de sécurité. (Il ne notifie pas suspendu applications.) Si votre application reçoit cet avertissement, il doit libérer davantage de mémoire que possible. La meilleure façon de le faire est de supprimer les références fortes pour les caches, les objets de l'image, et d'autres objets de données qui peut être recréé plus tard.

UIKit fournit plusieurs façons de recevoir de mémoire faible avertissements, y compris les suivantes:

  • Mettre en œuvre les applicationDidReceiveMemoryWarning: méthode de votre application délégué.
  • Remplacer le didReceiveMemoryWarning méthode dans votre personnalisé Sous-classe UIViewController.
  • S'inscrire pour recevoir la UIApplicationDidReceiveMemoryWarningnotificationnotification.

Comment Réduire l'Encombrement Mémoire de Votre Application?

  • Éliminer les fuites de mémoire.
  • Faire des fichiers de ressources aussi petite que possible.
  • Utilisation de Base de Données SQLite ou de grands ensembles de données.
  • Charger les ressources paresseusement.
  • Créer votre programme à l'aide de la Manette de l'option.

Des détails à l' http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


Comment allouer de la mémoire à bon escient?

  • Réduisez votre utilisation de autoreleased objets : automatique référence de comptage (ARC), il est préférable d'alloc/init objets et de laisser le version du compilateur pour vous au moment opportun. C'est vrai même pour les objets temporaires qui, dans le passé, vous pourriez avoir autoreleased pour les empêcher de vivre le passé de la portée de la méthode actuelle.
  • Imposer de limites de taille sur les ressources : Éviter le chargement d'un grand fichier de ressources un plus petit on va faire. Au lieu d'utiliser une image en haute résolution, utilisez l'une qui est d'une taille appropriée pour iOS dispositifs. Si vous doit utiliser les gros fichiers de ressources, de trouver des moyens pour charger uniquement la partie de le fichier que vous avez besoin à un moment donné. Par exemple, plutôt que de charger tout le fichier en mémoire, l'utilisation du pamm et munmap fonctions pour la carte des portions du fichier en mémoire. Pour plus d' informations sur le mappage des fichiers en mémoire.
  • Éviter la surabondance des ensembles de problèmes : Unbounded ensembles de problème peut nécessiter un nombre arbitrairement grand de données à calculer. Si le jeu nécessite plus de mémoire que ce qui est disponible, votre application peut être impossible d'effectuer la les calculs. Vos applications doivent éviter de tels ensembles chaque fois que possible et de travailler sur les problèmes connus avec les limites de la mémoire.

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