problème de mémoire ?

Bonjour,


J'ai fait une app simple pour iPhone.


Le problème, c'est qu'elle "mange" pas mal de mémoire,il y a un tableau de type c de taille 2500 et je ne sais pas comment l'annuler pour annuler cette mémoire à  la fin de son utilisation. Quand je lance l app sur mon iPhone 4S, elle marche super bien pendant un moment puis au fur et a mesure que je la lance, elle se ralentit au point de ne plus être utilisable à  la fin car presque bloquée. Le problème c'est que l'image de lancement se relance de temps en temps seulement et alors là  oui ça remarche mais comme cette image ne se lance pas systématiquement, ça bloque vite fait. Mes questions sont :


 


-comment vider de la mémoire mon tableau de type C (qui n'est pas un NSArray ni NSMutableArray mais un tableau comme on en déclare en C) ,quand j'ai fini de l'utiliser


-comment faire pour que l'image de lancement se lance à  chaque démarrage de mon app ?


 


Merci beaucoup de m'avoir lu et d'éventuellement pouvoir m'aider.  ::)


Réponses

  • Ton application utilise ARC ?? (c'est un garbage collector)


     


    Si oui c'est très bizarre


  • oui, elle utilise ARC....d'où mon malaise....


  • Comment créées-tu ton tableau ?

    Pourquoi utiliser un tableau C ? As-tu réellement besoin constamment de ces 2500 cases ?

    As-tu un Memory Warning ?


  • en fait je crée deux tableaux :



    CGRect rectangle[2500];
    UIView *subview[2500];

    mais subview je le vide par un nil lorsque j ai fini de l utiliser....


    quant à  rectangle, je ne sais comment faire, nil ne marche pas car ce n'est pas un pointer...


     


    je ne suis pas un pro lil


  • en fait j ai résolu le problème de la mémoire du aux tableaux (je n utilise plus de tableaux et ça marche aussi bien lol)


    par contre, je suis intéressé de savoir comment faire pour que l image de lancement se lance à  chaque démarrage de l app, quelqu un a t il déjà  rencontré un tel problème ? Merci beaucoup.


  • Tu crée un tableau de plus de 2500 vues :OOOOOOOOOOO


  • oui mea culpa  ;D


    par contre je cherche à  savoir pour le lancement de l image de l app...


  • Am_MeAm_Me Membre
    juillet 2013 modifié #9

    Ca ??? 


     


    MAJ : C'est la façon la plus simple et correcte que j'ai trouvé :D


    Apres elle ne répondra pas forcement à  tes attentes 


  • juillet 2013 modifié #10


    Ton application utilise ARC ?? (c'est un garbage collector)




    Pas du tout... Contrairement au Garbage Collector, ARC effectue sa tambouille à  la compilation en plaçant des release de façon invisible pour le développeur. D'où l'intérêt de tout de même connaitre les principes de base du MRC afin de correctement déclarer ses propriétés.


     


    Pour revenir au sujet principal : c'est du grand n'importe quoi ce que tu as fait..


    Essaie de nous expliquer ce que tu veux faire et on t'orienteras vers une solution beaucoup plus simple et rapide...


  • zoczoc Membre
    juillet 2013 modifié #11


    en fait je crée deux tableaux :



    CGRect rectangle[2500];
    UIView *subview[2500];

    mais subview je le vide par un nil lorsque j ai fini de l utiliser....


    quant à  rectangle, je ne sais comment faire, nil ne marche pas car ce n'est pas un pointer...


     


    je ne suis pas un pro lil




     


    Bah de toute façon, les tableaux C ont une taille fixée à  la compilation, donc au démarrage du programme, les tableaux consomment déjà  un espace mémoire de 2500 * sizeof(CGRect) + 2500 * sizeof(UIView *). 


     


    C'est déjà  une aberration en soit, mais ça n'explique en rien le fait que le programme se met à  ramer. Par contre instancier 2500 UIView ou dérivés, ça, ça peut faire ramer à  terme puisque ça consomme petit à  petit de la mémoire sur le tas.




  • Pas du tout... Contrairement au Garbage Collector, ARC effectue sa tambouille à  la compilation en plaçant des release de façon invisible pour le développeur. D'où l'intérêt de tout de même connaitre les principes de base du MRC afin de correctement déclarer ses propriétés.


     


    Pour revenir au sujet principal : c'est du grand n'importe quoi ce que tu as fait..


    Essaie de nous expliquer ce que tu veux faire et on t'orienteras vers une solution beaucoup plus simple et rapide...




    Oui mais au fond l'ARC rejoint le principe de garbage collector comme celui du Java sauf qu'Apple a zigouillé puis appelé ARC



  • Oui mais au fond l'ARC rejoint le principe de garbage collector comme celui du Java sauf qu'Apple a zigouillé puis appelé ARC




    Pas du tout... -.- Y'a une grande différence entre un gros bouzin qui balaye ton app en permanence pendant qu'elle tourne histoire de voir si y'a pas des objets que t'utilises plus et un système qui agit intelligemment à  la compilation de ton app en plaçant des release là  où il faut et ainsi éviter l'erreur humaine le plus possible et aussi optimiser les appels de release...

  • Bon bah j'ai rien dit alors :D


  • AliGatorAliGator Membre, Modérateur
    juillet 2013 modifié #15
    ARC n'a rien a voir avec du GC.

    La seule similitude c'est que pour celui qui code dans les faits dans les 2 cas il n'a plus à  libérer la mémoire lui-même via des instructions de code, mais ça s'arrête là . ARC est bien plus puissant que du GC et est implémenté de manière totalement différente. Ce n'est pas un ramasse-miette qui fait le ménage quand il a le temps et seulement après un petit moment comme le GC, c'est une gestion à  la compilation qui rajoute les instructions nécessaire au plus tôt dans le code compilé ; ce qui rend le système ARC carrément plus efficace. Du coup en terme de performance, d'empreinte mémoire et d'implémentation les 2 ne sont pas comparables, ARC étant bien plus optimal dans tous ces cas.
  • LarmeLarme Membre
    juillet 2013 modifié #16


    Oui mais au fond l'ARC rejoint le principe de garbage collector comme celui du Java sauf qu'Apple a zigouillé puis appelé ARC




    Oui. Mais uniquement du point de vue du novice (en dév) qui ne sait pas ce qui se passe derrière et n'a aucune notion de libération de la mémoire et surtout de quand elle va se faire, parce que dans les faits...




  • Oui. Mais uniquement du point de vue du novice (en dév) qui ne sait pas ce qui se passe derrière et n'a aucune notion de libération de la mémoire et surtout de quand elle va se faire, parce que dans les faits...




    Vu que je suis novice ;D c'est pour ca que je disais ca


    Etonné par la réponse d'Aligator merci : c'est complet directe et précis 

  • AliGatorAliGator Membre, Modérateur
    De plus puisque c'est fait à  la compilation avec ARC du coup du tu as un problème identifiable par le compilateur à  ce niveau, genre un retain cycle par exemple, ou l'accès â une variable weak que tu aurais oublié de stringyfier avant de faire des enchaà®nements d'appels entre lesquels la ZWR pourrait être passée à  "nil" entre temps, etc... bah du coup le compilateur peut te le dire, donc tu es prévenu à  la compilation et pas en testant au Runtime et en espérant avoir la chance de tomber sur le problème quand tu testes pour l'identifier et le corriger avant que ce ne soient tes utilisateurs qui en fassent les frais (freeze, lenteurs, crashs...)

    Alors qu'avec un GC comme en Java, y'a pas de détection a la compilation, donc s'il y a un de ces problèmes bon courage pour faire du stress-test de ton appli pendant des heures pour t'en apercevoir, et pire encore, du coup y'a un ramasse-miette qui tourne en permanence à  l'exécution et qui examine régulièrement tous les objets crées depuis le début de l'appli pour voir s'il y en a qui pourraient être libérés, en devant vérifier à  chaque passé que personne les utilise... donc ça prend du temps et du CPU à  l'exécution, ça ne relâche les objets que quand le ramasse-miette décide de passer (pas forcément à  tous les cycles), laissant potentiellement la mémoire grimper haut avant qu'elle soit nettoyée que plus tard pour enfin redescendre... tu m'étonnes que l'empreinte mémoire grimpe et que les perfs soient ralenties par l'exécution de cette analyse de la mémoire régulière quand tu utilises un GC... alors qu'avec ARC, rien de tous ces inconvénients, et aucune dégradation au Runtime. Au contraire même, plutôt une accélération d'ailleurs, car les balancements entre retain et release sont optimisés et "collapsed across methods calls and returns" comme expliqué en long, en large et en travers dans les vidéos de la WWDC de l'an dernier où tout ça est très vin expliqué dans les moindres détails.
Connectez-vous ou Inscrivez-vous pour répondre.