[iOS] TableviewCell gestion de la mémoire

lundi 6 février 2017

Dans cet article, je vais expliquer comment créer une liste avec TableView tout en gérant correctement la mémoire pour éviter des soucis de performance ne cas de longue liste de données.

On créé dans le story board un élément tableviewCell on y met un identifier et une class de type ElementCell. Ensuite on créé notre fichier ElementCell qui contiendra la personnalisation de la cellule.

Voici un exemple d’implémentation d’une liste de TableViewCell Custom depuis la fonction delegate cellForRowAtIndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Récupérons le bon élément
    let element = elements[indexPath.row]

    // Créons une cellule
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "ElementCell")

    // On y ajoute les bonnes informations
    cell.textLabel?.text = element.symbol
    cell.detailTextLabel?.text = element.name

    // On retourne la cellule
    return cell
}	

Si on a 300 records à afficher, on créé 300 cellules en mémoire et si vous regarder la gestion de la mémoire, quand vous défilez dans la liste, la mémoire vive consommée par l’application ne fait qu’augmenter, augmenter et augmenter.
Il existe de la mémoire qui n’est jamais désallouée.
Cela signifie que l’application pourrait (et va) éventuellement crasher pour cause de trop forte consommation de mémoire vive.
Dans ce cas-ci, on créé une nouvelle cellule à chaque fois que la fonction delegate cellForRowAt est appelée.

Il faut donc réutiliser les cellules.
L’idée de base de la réutilisation des cellules est de récupérer les cellules qui disparaissent lorsqu’on défile, et de les afficher à nouveau là où on en a besoin.
Pour cela, rien de plus facile, on change la ligne de création de cellule

// Essayons de réutiliser une cellule
let cellIdentifier = "ElementCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier forIndexPath:indexPath)?? UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier)

Dans ce cas-ci on réutilise une cellule si elle existe pas on la créé.

Le but est de ne pas chaque fois créer en mémoire les cellules au risque d’alourdir les performances de la tableview et saturer la mémoire. En faite la fonction dequeueReusableCell réutilise des cellules existantes.
Donc en réaliter, on créé 70 rows représentant les rows affichage dans le device et ensuite quand on défile, elles sont stockées sur le coté comme un système de pile et on va chercher les même cellules avec des données différentes plutôt que de créer en mémoire chaque fois une cellule et avoir par exemple 300 cellules en mémoires ….

Tags: mémoire , UITableView , UITableViewCell