Chaque fois que je crée une nouvelle sous-classe View Controller, Xcode ajoute automatiquement la méthode
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated
}
Habituellement, je le supprime ou l'ignore. C'est aussi ce que font tous les tutoriels que j'ai vus. Mais je suppose que puisque Xcode me le donne à chaque fois, cela devrait être quelque peu important, non? Que dois-je faire ici? Je suppose que l'élimination des ressources signifie leur mise à zéro, mais que sont exactement les "ressources qui peuvent être recréées"?
J'ai vu ces questions:
Mais ils sont tous pré-Swift. Bien que je ne sache pas grand chose sur Objective-C, j'ai entendu dire que la gestion de la mémoire est différente. Comment cela affecte-t-il ce que je dois faire dans didReceiveMemoryWarning
?
Autres notes:
didReceiveMemoryWarning
que j'ai trouvé était plutôt bref.Swift utilise ARC comme Objective-C ( source to Apple Docs ). Le même type de règles s'applique pour libérer de la mémoire, supprimez toutes les références à un objet et il sera désaffecté.
Je suppose que l'élimination des ressources signifie leur mise à zéro, mais que sont exactement les "ressources qui peuvent être recréées"?
"les ressources qui peuvent être recréées" dépendent vraiment de votre application.
Imaginons que vous soyez une application de médias sociaux qui traite de nombreuses photos. Vous voulez une interface utilisateur accrocheuse afin de mettre en cache les 20 images suivantes en mémoire pour accélérer le défilement. Ces images sont toujours enregistrées sur le système de fichiers local.
Vous créez un jeu étonnant qui a un certain nombre de niveaux différents. Le chargement d'un niveau dans votre moteur de jeu sophistiqué prend un certain temps, donc si l'utilisateur a suffisamment de mémoire, vous pouvez charger le niveau 3 pendant qu'il joue au niveau 2.
LevelCache.sharedCache().nextLevel = nil
libère toute cette mémoireNe désallouez jamais ce qui est à l'écran. J'ai vu des réponses à des questions connexes désallouer la vue de l'UIViewController. Si vous supprimez tout de l'écran, vous pourriez bien planter (à mon avis).
Si l'utilisateur a ouvert un document qu'il est en train de modifier, NE PAS le désallouer. Les utilisateurs se mettront en colère contre vous si votre application supprime leur travail sans jamais être enregistrée. (En fait, vous devriez probablement avoir un mécanisme de sauvegarde d'urgence lorsque cela se produit)
Si votre utilisateur écrit un article pour votre fabuleuse application de médias sociaux, ne perdez pas son travail. Enregistrez-le et essayez de le restaurer lorsqu'ils rouvrent l'application. Bien que la configuration nécessite beaucoup de travail, j'adore les applications qui le font.
La plupart des appareils modernes manquent rarement de mémoire. Le système fait un très bon travail en tuant les applications en arrière-plan pour libérer de la mémoire pour l'application qui s'exécute au premier plan. Vous avez probablement déjà vu une application "ouverte" dans le sélecteur d'applications lorsque vous avez appuyé sur l'application, elle s'est ouverte à son état initial. Le système d'exploitation a tué l'application en arrière-plan pour libérer de la mémoire. Voir State Restoration pour plus d'informations sur la façon d'éviter ce problème.
Si votre application reçoit des avertissements de mémoire cohérents lorsque vous n'effectuez pas une énorme quantité de traitement, assurez-vous que vous ne perdez pas de mémoire en premier. La détection des fuites de mémoire sort du cadre de cette réponse. Docs et un tutoriel .
Lorsque didReceiveMemoryWarning
est appelé, cela signifie que votre application utilise trop de mémoire (par rapport à la mémoire de l'appareil), et vous devez release any additional memory used by your view controller
pour réduire la mémoire de votre application. Si l'application mémoire dépasse la mémoire de l'appareil, iOS va tuer votre application immédiatement. "ressources qui peuvent être recréées" signifie quelque chose que vous pouvez recréer quelque part, vous n'en avez pas besoin maintenant (pas besoin de les mettre en mémoire). Et vous pouvez le libérer lorsque vous obtenez didReceiveMemoryWarning
.
Voici un autre sujet de détail: budget de mémoire maximum de l'application ios