Por que devemos liberar os IBOutlet no método viewDidUnload?
sobes.tech IA
Resposta da IA
viewDidUnload é chamado após a vista do controlador ser descarregada da memória, geralmente devido à falta de recursos. Neste método, libertamos (nil ou deallocate) os IBOutlet que mantêm referências aos elementos da interface de utilizador, para quebrar os ciclos de referências fortes e permitir que a memória ocupada por esses elementos seja libertada. Isto previne fugas de memória.
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidUnload() {
super.viewDidUnload()
// Libertar quaisquer sub-visualizações retidas da vista principal.
// por exemplo, self.myOutlet = nil;
myLabel = nil // Libertamos o IBOutlet
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Elementos de UI podem ser recriados aqui
if myLabel == nil {
// Recriar ou re-inicializar o rótulo se necessário
}
}
}
É importante notar que desde o iOS 6 e versões posteriores, o método viewDidUnload foi eliminado e não é mais chamado. A gestão de memória para as vistas agora é automatizada usando referências fracas (@IBOutlet weak) e Contagem Automática de Referências (ARC). Os IBOutlet marcados como weak tornam-se automaticamente nil quando o objeto de vista correspondente é descarregado da memória.
Portanto, no desenvolvimento moderno de iOS, não é necessário nem eficaz libertar explicitamente os IBOutlet em viewDidUnload.
| Versão do iOS | Comportamento de viewDidUnload |
Recomendação para IBOutlet |
|---|---|---|
| Até iOS 6 | É chamado ao descarregar a vista da memória. | Libertar (nil). |
| iOS 6+ | Não é chamado. | Usar weak. |