web-dev-qa-db-fra.com

Développement iOS: Comment puis-je provoquer des avertissements de mémoire faible sur l'appareil?

J'aimerais bien tester les fonctions de mon application dans des conditions de mémoire faible, mais c'est difficile à tester. Comment puis-je induire des avertissements de mémoire faible qui déclenchent la méthode didReceiveMemoryWarning dans mes vues lorsque l'application s'exécute sur l'appareil, pas sur le simulateur? Ou de quelle manière puis-je tester mon application dans ces conditions possibles?

La raison pour laquelle je ne peux pas utiliser le simulateur est que mon application utilise Game Center et que les invitations ne fonctionnent pas sur le simulateur.

84
BeachRunnerFred

Pour tester sur un appareil, ajoutez simplement du code qui alloue périodiquement de gros morceaux de mémoire sans le libérer (c'est-à-dire une fuite exprès). Vous pouvez le faire dans un thread séparé, ou en réponse à une minuterie, ou en utilisant le mécanisme qui vous permet le mieux de tester et d'observer le comportement de votre application.

Vous pouvez également choisir de créer une application distincte qui fait quelque chose de similaire et est conçue pour fonctionner en arrière-plan, si vous souhaitez facilement la réutiliser et/ou tester avec plusieurs applications.

7
BinaryStar

Vous pouvez appeler la méthode privée:

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

N'oubliez pas de l'utiliser uniquement sur le débogage, sinon votre application sera rejetée.

272
Enzo Tran

L'élément de menu Simulate Memory Warning Du simulateur iOS vous permet de simuler un avertissement de mémoire.

25
Ole Begemann

À l'aide des instruments, utilisez l'élément de menu: Instrument -> Simuler l'avertissement de la mémoire.

Pour utiliser Instruments sur votre application à partir de Xcode, utilisez l'élément de menu Produit -> Profil.

19
ThomasW

J'ai réécrit réponse d'Enzo Tran dans Swift:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
9
ChikabuZ

@ChikabuZ converti en Swift 3:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
7
kindaian

Il y a une commande de menu qui l'invoquera.

Hardware > Simulate Memory Warning depuis le simulateur.

7
Daniel A. White

Si quelqu'un, pour une raison quelconque, essaie de le faire dans Swift 4 - voici comment allouer 1,2 Go de RAM.

let d = Data.init(repeating: 100, count: 1200000000)
5
Adobels

Si quelqu'un, pour une raison quelconque, essaie de le faire dans Swift 3 - voici comment allouer 1,2 Go de RAM.

   for i in 0...1200 {
      var p: [UnsafeMutableRawPointer] = []
      var allocatedMB = 0
      p.append(malloc(1048576))
      memset(p[allocatedMB], 0, 1048576);
      allocatedMB += 1;
   }
3
ph1lb4

Swift 4:

UIApplication.shared.perform (Selector (("_ performMemoryWarning"))))

Peut exécuter ce qui précède en réponse à un événement/notification.

1
Vishal Chaudhry