Partage
  • Partager sur Facebook
  • Partager sur Twitter

problem 2 memoire a cose 2 [tableView reloadData]

Sujet résolu
    10 avril 2019 à 11:49:23

    Bonjour,

    Je suis en train de realiser une application en temps reelle qui a besoin de rafraichir la tableview en permanence.
    Le soucis c'est que pour une raison que j'ignore cela consomme de la memoire.

    J'ai essaye d'utiliser @autoreleasepool mais ca n'a aucun effet.

    En fouillant sur le net, j'ai trouve une personne ayant eut le meme soucis que moi: 

    https://stackoverflow.com/questions/4029603/uitableview-reloaddata-many-times-cause-memory-leak-and-slow-down-application

    J'ai donc essaye cette methode mais mon programme plante.
    Pouvez vous me dire ou est mon erreur ?

    int int_index = 1;
    NSIndexPath *ns_index = [NSIndexPath indexPathWithIndex:int_index];
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:ns_index] withRowAnimation:UITableViewRowAnimationFade];


    Sachant que si je fais:

    [self.tableView reloadData];

    Ca fonctionne tres bien excepte la consommation de memoire.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2019 à 21:00:28

      Salut,

      le problème vient très probablement de ce que tu fais dans tes méthodes de datasource. Si tu scrolled, même problème de mémoire ? Si c’est le cas c’est peut être que tu reuse pas tes cells

      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2019 à 21:33:57

        @Geda: merci de ta reponse
        "Si tu scrolled, même problème de mémoire ?"
        ---> On affiche entre 1 a 7 lignes donc pas de scoll
        "Si c’est le cas c’est peut être que tu reuse pas tes cells"
        ---> Ok ... mais comment je fais ca ?
        Voici la methode qui manipule les cell:
        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
         BLEConnectionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[BLEConnectionTableViewCell cellIdentifier]];
        
            if (cell == nil) {
        
                cell = [[BLEConnectionTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[BLEConnectionTableViewCell cellIdentifier]];
        
            }
        
        
        
            return cell;
        
        }
        Et voici le contenu du fichier BLEConnectionTableViewCell.m:
        #import "BLEConnectionTableViewCell.h"
        
        @implementation BLEConnectionTableViewCell
        
        + (NSString *)cellIdentifier {
            return  @"BLEConnectionTableViewCell";
        }
        
        - (void)awakeFromNib {
            [super awakeFromNib];
        
            _nameLabel.numberOfLines = 0;
            _nameLabel.lineBreakMode = NSLineBreakByWordWrapping;
            _nameLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 40;
        
            _identifierLabel.numberOfLines = 0;
            _identifierLabel.lineBreakMode = NSLineBreakByCharWrapping;
            _identifierLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 80;
        
            _stateLabel.numberOfLines = 0;
            _stateLabel.lineBreakMode = NSLineBreakByWordWrapping;
            _stateLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 40;
        }
        
        @end
        Ou est mon erreur ?
        Que dois je modifier ?
        Edit: C'est bon j'ai trouver la solution: https://www.ht.sfc.keio.ac.jp/~takuro/blog/files/aeda2f79266b77efe9354597e3a30b10-21.html

        -
        Edité par Scion 11 avril 2019 à 3:32:22

        • Partager sur Facebook
        • Partager sur Twitter
          11 avril 2019 à 10:45:58

          On affiche entre 1 a 7 lignes donc pas de scoll >>> Agrandis la taille des cellules, dupliques les data,  y'a plein de solutions pour voir ce que ça fait lors d'un scroll.

          Voici la methode qui manipule les cell: >>> Ça a l'air correct.

          Ton site chinois j'ai pas trop compris ce qu'il conseillait de faire. Toutefois, ça m'a plus l'air d'être un workaround pour éviter de provoquer la fuite mémoire qu'une solution pour corriger la fuite mémoire. 

          • Partager sur Facebook
          • Partager sur Twitter
            12 avril 2019 à 1:48:20

            @Geda:
            Merci pour ton retrour.
            D'apres ce que j'ai compris du site japonais (et non chinois ^^)
            Il ne faut pas utiliser "reloadData" si l'on souhaite mettre a jour la table view dans un contexte de realtime.
            Il propose plutot de faire une boucle sur les cellules (visible) du tableau via sa methode: updateVisibleCells
            De mon cote, ca fonctionne. Je n'ai plus d'augmentation de la consommation de la memoire.
            • Partager sur Facebook
            • Partager sur Twitter

            problem 2 memoire a cose 2 [tableView reloadData]

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown