Sobes.tech
Middle

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.