Sobes.tech
Middle

Perché dobbiamo liberare gli IBOutlet nel metodo viewDidUnload?

sobes.tech AI

Risposta dell'AI

viewDidUnload viene chiamato dopo che la vista del controller è stata scaricata dalla memoria, di solito a causa di mancanza di risorse. In questo metodo, liberiamo (nil o deallocate) gli IBOutlet che mantengono riferimenti agli elementi dell'interfaccia utente, per interrompere i cicli di riferimenti forti e permettere alla memoria occupata da questi elementi di essere liberata. Questo previene perdite di memoria.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Rilasciare eventuali sotto-visualizzazioni trattenute dalla vista principale.
        // ad esempio, self.myOutlet = nil;
        myLabel = nil // Rilasciamo l'IBOutlet
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Elementi UI possono essere ricreati qui
        if myLabel == nil {
            // Ricreare o re-inizializzare l'etichetta se necessario
        }
    }
}

È importante notare che da iOS 6 e versioni successive, il metodo viewDidUnload è stato eliminato e non viene più chiamato. La gestione della memoria per le viste ora è automatizzata usando riferimenti deboli (@IBOutlet weak) e il conteggio automatico delle referenze (ARC). Gli IBOutlet contrassegnati come weak diventano automaticamente nil quando l'oggetto vista corrispondente viene scaricato dalla memoria.

Pertanto, nello sviluppo moderno di iOS, non è necessario né efficace liberare esplicitamente gli IBOutlet in viewDidUnload.

Versione iOS Comportamento di viewDidUnload Raccomandazione per IBOutlet
Fino a iOS 6 Viene chiamato quando la vista viene scaricata dalla memoria. Liberare (nil).
iOS 6+ Non viene chiamato. Usare weak.