Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Problema de Memória na Navegação

Tenho uma dúvida referente a nevagação do aplicativo que é a seguinte:

Quando acabamos o Quiz e tocamos no botão "Reiniciar Quiz" na tela de "Desempenho", isso faz com que o app volte para a tela "Home", para a tela onde iniciamos o Quiz novamente, até aí tudo certo. Só que da maneira como é feita essa navegação via storyboard me parece que o que estamos fazendo na verdade é empilhar mais telas toda vez que tocamos em "Reiniciar Quiz", pois em nenhum momento estamos falando para a nossa navigationController zerar a pilha de navegação, então a minha dúvida é: se isso realmente está acontecendo, isso não está causando um vazamento de memória no app? pois toda vez que empilhamos mais telas na nossa navigationController, mais memória nosso app vai consumir, certo?

Eu até pesquisei um pouco a respeito desse problema, mas não encontrei nenhuma maneira de resolver isso via storyboard, somente de maneira programática, que é a seguinte:

1º - Criar uma action do botao "Reiniciar Quiz": @IBAction func botaoPressionado(_ sender: UIButton) { }

2º - Adicionar o seguinte método: @IBAction func botaoPressionado(_ sender: UIButton) { navigationController?.popToRootViewController(animated: true)}

Esse método tem como finalidade remover todas as telas empilhadas na pilha de navegação e retorna para a primeira tela (root) que foi empurrada pelo UINavigationController.

Então se o problema realmente existe, essa solução remove esse problema? Eu consigo fazer algo parecido com isso através de alguma ligação no storyboard ou fazer isso só é possível programaticamente?

1 resposta
solução!

Olá, Juliano, como vai?

Você está certo. Quando você navega de volta para a tela "Home" sem limpar a pilha de navegação, as telas anteriores continuam alocadas em memória, o que pode levar a um consumo desnecessário. Sim, isso caracteriza um vazamento de memória, já que novas instâncias são empilhadas sem liberar as anteriores.

A solução que você mencionou, usando popToRootViewController, é a forma mais direta de resolver esse problema. Ela remove todas as telas intermediárias e retorna à raiz da navegação, liberando a memória ocupada por elas.

Sobre realizar isso via Storyboard, não há uma opção direta ou declarativa para manipular a pilha de navegação dessa forma. Até onde eu conheço, soluções como essa costumam ser implementadas por código, principalmente quando se quer ter controle total sobre o fluxo de telas e a liberação de memória.

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar.

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado