Sobes.tech
Middle

Pourquoi devons-nous libérer les IBOutlet dans la méthode viewDidUnload ?

sobes.tech IA

Réponse de l'IA

viewDidUnload est appelé après que la vue du contrôleur a été déchargée de la mémoire, généralement en raison d'un manque de ressources. Dans cette méthode, nous libérons (nil ou deallocate) les IBOutlet qui maintiennent des références aux éléments de l'interface utilisateur, afin de rompre les cycles de références fortes et permettre la libération de la mémoire occupée par ces éléments. Cela évite les fuites de mémoire.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Libérer toute sous-vue retenue de la vue principale.
        // par ex., self.myOutlet = nil;
        myLabel = nil // Libérons l'IBOutlet
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Les éléments UI peuvent être recréés ici
        if myLabel == nil {
            // Recréer ou réinitialiser le label si nécessaire
        }
    }
}

Il est important de noter qu'à partir d'iOS 6 et versions ultérieures, la méthode viewDidUnload a été supprimée et n'est plus appelée. La gestion de la mémoire pour les vues est désormais automatisée à l'aide de références faibles (@IBOutlet weak) et du comptage automatique des références (ARC). Les IBOutlet marqués comme weak deviennent automatiquement nil lorsque l'objet de vue correspondant est déchargé de la mémoire.

Par conséquent, dans le développement iOS moderne, il n'est ni nécessaire ni efficace de libérer explicitement les IBOutlet dans viewDidUnload.

Version iOS Comportement de viewDidUnload Recommandation pour IBOutlet
Jusqu'à iOS 6 Appelé lors du déchargement de la vue de la mémoire. Libérer (nil).
iOS 6+ Non appelé. Utiliser weak.