Diferença entre viewDidLoad e viewDidAppear

Respostas:

147

viewDidLoadé chamado exatamente uma vez, quando o controlador de visualização é carregado pela primeira vez na memória. É aqui que você deseja instanciar quaisquer variáveis ​​de instância e construir quaisquer visualizações que vivam por todo o ciclo de vida deste controlador de visualização. No entanto, a vista geralmente ainda não é visível neste ponto.

viewDidAppearé chamado quando a visualização está realmente visível e pode ser chamado várias vezes durante o ciclo de vida de um Controlador de Visualização (por exemplo, quando um Controlador de Visualização Modal é descartado e a visualização se torna visível novamente). É aqui que você deseja executar qualquer ação de layout ou qualquer desenho na IU - por exemplo, apresentar um controlador de visualização modal. No entanto, qualquer coisa que você fizer aqui deve ser repetida. É melhor não reter as coisas aqui, ou você terá vazamentos de memória se não liberá-los quando a vista desaparecer.

Veja: https://developer.apple.com/documentation/uikit/uiviewcontroller

Davidgoli
fonte
15
Você e WrightsCS estão absolutamente certos. Mas, não para dividir fios de cabelo, mas embora viewDidLoadgeralmente seja chamado apenas uma vez, há uma situação em que pode ser chamado novamente. Especificamente, se você receber um didReceiveMemoryWarning, suas visualizações não visíveis podem ser liberadas (embora os controladores de visualização estejam intactos) e quando você retornar, viewDidLoadpode ser chamado para buscá-las novamente.
Rob
1
Não tenho certeza se concordo com o comentário sobre ver ivars controlador sempre e automaticamente sendo lançado para você (o controlador em si não é lançado). Eu suspeito que nós dois poderíamos construir facilmente um viewDidLoad que vazaria se fosse invocado novamente após um didReceiveMemoryWarning. Mas eu concordo que se você usar boas práticas ao escrever o seu viewDidLoad, você ficará bem. Meu único ponto é que o uso descuidado de ivars e gerenciamento manual de memória pode definitivamente resultar em vazamentos viewDidLoad. As pessoas devem ser sensíveis ao didReceiveMemoryWarningcenário e programar de acordo.
Rob
2
Para não entrar em detalhes, mas menos de 24 horas após essa troca, enquanto respondia a outra pergunta , encontrei um exemplo precisamente do tipo de viewDidLoadcódigo que vazará didReceiveMemoryWarning. Suspiro.
Rob
1
Esta resposta contradiz diretamente esta outra: stackoverflow.com/a/3411636/269753 Tenho observado meu método viewDidLoad sendo chamado mais de uma vez, mesmo quando não recebo nenhum aviso de memória. Alguém quer esclarecer?
Ricardo Sanchez-Saez,
2
Não vejo que haja uma contradição. Essa pergunta é sobre a relação entre viewDidLoad e viewDidUnload, não viewDidAppear.
Davidgoli
21

Simplificando, você gostaria de criar quaisquer controles ou matrizes em viewDidLoad, onde viewDidAppearé onde você gostaria de atualizar esses controles ou matrizes.

viewDidLoadé chamado uma vez quando o controlador é criado e viewDidAppearé chamado sempre que a visualização, bem, DID aparece. Então, digamos que você tenha uma visualização modal que você apresenta, quando essa visualização for descartada, viewDidAppearserá chamada, e viewDidLoadnão será chamada.

WrightsCS
fonte
3
O primeiro parágrafo é uma dica bem colocada. Mas o segundo parágrafo está incorreto. viewDidLoadpode ser chamado mais de uma vez . Se a sua visualização enquanto não é exibida (sob uma pilha de outras visualizações) é descarregada por versões mais antigas do iOS em uma situação de pouca memória, então o controlador de visualização recarregará automaticamente a visualização quando precisar ser reapresentada na tela. Em versões posteriores do iOS, você pode optar por ajudar a reduzir o uso de memória fazendo o que o iOS anterior fazia por você: Descarregue visualizações fora da tela quando a didReceiveMemoryWarningmensagem chegar; nesse caso, o viewDidLoadserá chamado novamente.
Basil Bourque
@WrightsCS você tem algum documento oficial da apple que diz isso? "viewDidLoad é chamado uma vez quando o controlador é criado" Porque eu me lembro no passado viewDidLoad podia ser chamado várias vezes em cenários de pouca memória. Muito obrigado.
Ricardo