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. |