2010-10-18 20 views
1

est-il possible, que lorsque l'application iPad est forcée fermée/tuée par l'iOS en raison d'une «situation de mémoire insuffisante», la mémoire de l'application allouée n'est-elle pas libérée à 100%? Je pense que la mémoire allouée directement par le client est libérée - il y a même un support HW pour cela, mais nous observions que si l'application est fermée/tuée par iOS et par conséquent redémarrée, de moins en moins de mémoire est disponible, jusqu'à ce que l'iPad être redémarré. Nous pensons que certaines mémoires sont allouées par ex. en exécutant des démons en arrière-plan, qui effectuent un certain travail pour le compte de l'application et si la communication inter-processus n'est pas terminée, la mémoire utilisée côté démon peut ne pas être libérée correctement ...Problèmes d'iPad et de mémoire

Est-ce quelque chose comme ça? BR STeN

Répondre

0

Si vous allouez de la mémoire, il restera dans le tas jusqu'à ce que vous le relâchiez, même si l'application qui a fait l'alloc est révolue depuis longtemps. Comme vous l'avez vu, redémarrer l'appareil effacera le tas.

Vous devez toujours gérer les événements de mémoire, il existe une méthode pour cela.

- (void)didReceiveMemoryWarning; 

En général, vous libérerait tout ce que vous pouvez, surtout si son niveau 2, comme si vous ne le faites pas votre application va fermer de toute façon. Cependant, lorsque votre application se termine, elle devrait appeler dealloc quand même! donc vous pouvez avoir une fuite générale.

+0

Salut, êtes-vous vraiment sûr du fait que si le processus est tué par le système d'exploitation ou fermé par l'utilisateur, la mémoire qu'il alloue au cours de sa durée de vie n'est pas libérée automatiquement? Cela semble étrange, je ne sais pas OS, qui agit comme ceci ... – STeN

+0

Im pas un gourou sur ceci, mais même si vous écrivez un programme de C++/c dans Windows et faites un malloc sans un libre, ceci arrive aussi. Les langages de haut niveau sont différents car ils ont de bonnes collections de déchets, ou exécutent des applications dans les machines virtuelles et peuvent donc simplement tuer la mémoire de la machine virtuelle lorsque l'application se ferme mais C, obj-c et C++ ne sont pas comme ça. –

+0

De plus, si un objet a été alloué, mettez-le à zéro avant de le libérer. –

0

Je suis assez certain que la méthode:

- (void)applicationWillTerminate:(UIApplication *)application; 

va fonctionner même si l'application se bloque. Ce serait un bon moment pour s'assurer que tout est libéré, s'il n'est pas attrapé par memoryWarning.

+0

Salut, je suis convaincu, qu'une bonne application devrait tout libérer lors de la fermeture, mais quand l'OS appelle l'applicationWillTerminate et l'application est terminée à l'étape suivante j'espère que la mémoire est quand même libérée par le système d'exploitation lui-même. , Symbian, Windows terminé. Je suppose que cette méthode est plutôt à d'autres fins, comme par exemple la fermeture de fichiers, etc. BR – STeN

+0

Aucun iOS n'a aucun moyen de libérer la mémoire à moins que vous ne la manipuliez spécifiquement. Tous les objets doivent être libérés s'ils sont conservés ou auto libérés. Si votre application tombe en panne avec des objets sur le tas, ils restent en mémoire jusqu'à ce que le périphérique soit redémarré. – Kyle

+0

Salut, je ne parle que des situations dans lesquelles le processus est tué/écrasé (voir mon commentaire ci-dessus) !! Ensuite, la mémoire normale allouée avec mallocs (C)/new (C++)/alloc (Obj-C) ou des fonctions connexes doit être libérée. J'espère que la même chose est sur iOS et j'en suis presque sûr! BR STeN – STeN