2

J'ai une application basée sur le contrôleur de navigation qui peut être active pendant une période relativement longue et peut charger plusieurs écrans, en en revisitant certains au cours de sa vie - une application métier. Quand je pousse un écran, j'attribue de la mémoire; quand je reviens (pop), je dois m'assurer que la mémoire n'est pas perdue.Comptabilité de l'utilisation de la mémoire dans une application basée sur un contrôleur de navigation;

Maintenant dans les fuites, j'ai une ardoise propre. Pas de fuite de mémoire, pas si difficile à faire avec la fonction d'analyse statique 10.6 et confirmé à l'aide d'instruments. Vérification manuelle, je suis sûr que je libère tout alloué dans viewWillAppear dans viewWillDisappear; tout alloué dans viewDidLoad dans viewDidUnload; tout alloué autrement dans dealloc.

J'ai utilisé NSZombiesEnabled en développement, mais je ne l'ai pas encore activé.

Lors de l'exécution sous Object Allocation, cependant, je constate une augmentation de l'utilisation de la mémoire. En entrant dans une nouvelle vue, je vois la mémoire augmenter mais ne pas diminuer de la même quantité lors de la navigation arrière. Ce n'est pas non plus simplement que le système ne se désengage pas immédiatement, lorsqu'il reste un certain temps, la mémoire reste statique. Ce comportement est vu sur chaque vue. Quelles techniques puis-je utiliser pour isoler cette mémoire?

Quelles techniques puis-je utiliser pour isoler cette mémoire? Devrais-je viser le retour de l'application à une ligne de base après chaque vue? Comment puis-je isoler les rapports de mémoire utilisés par des sous-systèmes tels que Core Data, où je me base sur des failles pour charger des objets et ne pas essayer de les manipuler explicitement, et le code sur lequel j'ai le plein contrôle?

Répondre

0

Il est naturel que l'empreinte mémoire des contrôleurs de navigation augmente au fur et à mesure que vous y insérez des vues. Si vous utilisez des données de base de toute façon, vous pouvez conserver l'état de l'ensemble de l'application aux données de base chaque fois que vous appuyez sur ou affichez une vue. De cette façon, rien ne sera perdu. Le module navigationController gère la mémoire des viewControllers. Si vous dépassez la mémoire des iPhones, il libère les viewControllers. Core Data gère la mémoire plutôt agressive, c'est donc un bon moyen d'y aller.

Par cette approche, je pense que vous utiliserez la gestion de la mémoire du cadre au lieu d'essayer de rouler vos propres et potentiellement introduire long termes bugs mémoire :)

Je pencherais pour quelque chose comme une entité par viewController et une Entité qui sauvegarde le contexte dans lequel les ont été chargés. De cette façon, vous pouvez juste tester pour voir si le framework a libéré l'un de vos viewController et ensuite restaurer la pile navigationController si c'est le cas.

Hope this était au moins quelque chose à considérer :)

+0

Merci - je craignais la réponse était « juste froid » ... mais il se sent mal à voir augmenter la mémoire comme ça. –

+0

Je sais :) Je fais ma première "grande" application et je me suis vraiment inquiété de ce que l'iPhone pourrait prendre en termes de gestion de la mémoire bâclée. Im tirant dans des listes de 1400 - 16.000 articles, empilant UITableViews personnalisés dans les contrôleurs de navigation 7-8 à la fois, préchargeant jusqu'à 20 pages pour un effet scrollView/pageControl, en utilisant une configuration de base de données semi-compliquée et l'analyse des fichiers XML dans différents threads. Je pensais que ce serait un cauchemar de gestion de la mémoire :) Je suis presque fini et la mémoire ne dépasse jamais 3 Mo. Je pense que l'iPhone 1G a environ 20 Mo et la 3G S a plusieurs fois plus. – RickiG

+0

Quand vous dites qu'il ne cesse d'augmenter, jusqu'où ça va en MB avant qu'il ne s'arrête? – RickiG

Questions connexes