2010-07-29 14 views
1

J'ai donc installé mon application sur mon ipad et elle se bloque en raison d'un problème de mémoire. Je me suis dit que c'était parce que j'utilisais de très gros fichiers d'images, alors je suis revenu et j'ai réduit tous ces fichiers et en ai pratiquement coupé environ 75% en les redimensionnant puis en utilisant PNGCrush. Maintenant, en ce qui concerne l'exécution du programme, si j'ai une image d'arrière-plan pour chacun de mes 4 onglets individuels, cela économiserait-il de la mémoire si je devais régler les images sur Null chaque fois que je changerais d'onglet ou devrais-je les laisser? ? J'ai une page qui contient quelques douzaines d'images car elles agissent comme des boutons et d'après ce que j'entends, il me semble que je devrais tout effacer quand je ne regarde pas cette page. Est-ce exact?Image Question pour iPad - Problèmes de mémoire

Maintenant, quand je démarre, je charge toutes les images pour tout dans l'application dans une sorte de: "charger maintenant et être fait avec" mentalité, mais de ce que j'ai lu qui provoque la mémoire problèmes car il n'y a pas beaucoup de mémoire à utiliser. Cela signifie-t-il que chaque fois que je change d'onglets ou de vues, je veux effacer toutes les images de celles qui ne sont pas visibles et les recharger quand on y retourne? Cela entraînerait-il une augmentation des performances? Ou au moins prévenir les accidents? Mon programme fonctionne dans le simulateur mais quand je le lance sur mon ipad il explose juste =/

Merci!

EDIT: J'utilise MonoTouch BTW donc tout est en C#

UIImage BG = UIImage.FromFile("Images/Makes/explosion.png"); 
UIImage basic = UIImage.FromFile("Images/Models/camaro.png"); 
UIImage advance = UIImage.FromFile("Images/search.png"); 

AdvancedSearchButton.SetBackgroundImage(advance, UIControlState.Normal); 
ImageSearchButton.SetBackgroundImage(basic, UIControlState.Normal); 
MainBG.Image = BG; 

BG.Dispose(); 
basic.Dispose(); 
advance.Dispose(); 

Maintenant, je sais en mémoire régulière C# dispose() ne fait pas « libre », mais je lis quelque chose qui dit qu'il est converti à "release" quand il compile à obj-c de sorte que serait essentiellement libérer ces objets.

Aussi, je me demande si je devrais dispose() des boutons individuels et l'image après que je ne les regarde plus. Je mettais juste l'image à NULL mais cela m'a donné des erreurs.

MainBG.Dispose(); 
AdvancedSearchButton.Dispose(); 
ImageSearchButton.Dispose(); 

Merci beaucoup pour l'aide!

EDIT2:

Je viens d'essayer le code ci-dessus et les images de fond et tout le reste sont toujours là et apparaît comme si rien est réellement obtenir effacé. Suggestions?

Répondre

2

L'iPhone n'a pas de mémoire virtuelle et il ne dispose pas de la récupération de place. Ainsi, une fois que quelque chose est chargé dans la mémoire, il reste dans la mémoire jusqu'à ce que votre code le libère explicitement. Si vous n'utilisez pas certaines ressources, vous devez définitivement les nettoyer dès que possible. De plus, vous devriez écouter les avertissements de mémoire faible d'iOS, ce qui est une autre occasion pour votre code de faire un nettoyage interne.

+0

"Donc, une fois que quelque chose est chargé dans la mémoire, il reste dans la mémoire jusqu'à ce que votre code le libère explicitement" Est-ce que cela signifie que si je définis un arrière-plan dans l'onglet 1, je veux le "libérer" en le définissant à Null? Est-ce que ce travail est ou là quelque chose d'autre que je devrais faire. Je comprends les concepts de libérer/libérer de la mémoire, je ne suis pas au courant de la façon de le faire dans ce cas. La majorité de mon application est juste des boutons avec des images en eux. – Adam

+0

Vous devez envoyer un message 'release' à l'objet backing' NSImage' avant de définir le pointeur sur NULL. –

+0

Donc, essentiellement, je voudrais charger mon NSImage à partir de mon fichier, définissez mon image à cela, puis relâchez l'image NS? Et quand je passerais de cette tabulation à une autre, je mettrais cette image à zéro. Je rincerais alors et répéterai si je suis revenu à cet onglet. Correct? – Adam

0

Tout d'abord, paressez chargez vos ressources, sauf si vous avez une raison valable de ne pas le faire. Deuxièmement, je ne suis pas sûr de la taille de vos images, mais sur de grandes images (qui sont par nature destinées à des choses comme les arrière-plans, ou autrement), en général, je vais les couper en morceaux, et les charger, encore une fois deviné, paresseusement comme ils sont nécessaires.

Ce que vous devez faire est de gérer vos avertissements de mémoire correctement. Déclarez toutes les ressources qui ne sont pas absolument critiques - c'est-à-dire, des éléments sur d'autres vues dans d'autres onglets, ou du contenu caché. Vous pouvez les charger à nouveau quand vous le devez.Vous devriez également jeter un oeil à l'aide d'instruments pour savoir si vous fuyez (j'espère que vous avez déjà fait cela), examinez votre programme pour voir si vous pouvez conserver certaines ressources mises en cache sur le disque dans des situations de faible mémoire