Sobes.tech
Middle

De que maneiras é possível detectar fugas de memória numa aplicação iOS?

sobes.tech IA

Resposta da IA

  • Instrumentos (Fugas): A ferramenta principal no Xcode para perfilamento e deteção de fugas de memória. Mostra as fugas detectadas, referências cíclicas e outros problemas de gestão de memória.

  • Gráfico de memória no Navegador DEBUG: Representação visual do gráfico de objetos em memória durante a execução da aplicação. Ajuda a identificar referências cíclicas que impedem o ARC de libertar objetos. Pode ser usado para procurar objetos sem referências.

  • Address Sanitizer (ASan): Ferramenta durante a compilação e execução que detecta erros de memória, incluindo uso após libertação, libertação dupla e estouro de buffer no heap. Embora não procure fugas diretamente, ajuda a encontrar erros que podem levar a fugas.

  • Analizador estático: Ferramenta integrada no Xcode para análise estática do código, que pode detectar problemas potenciais de memória, incluindo erros no contagem de referências e variáveis não inicializadas, antes de executar a aplicação.

  • Heaps: No Instruments, mostra todos os objetos vivos em memória e as suas ligações. Útil para identificar objetos que deveriam ser eliminados mas ainda existem.

  • Código personalizado para rastreamento de referências: Implementação de mecanismos próprios para rastrear o ciclo de vida dos objetos, como registar os seus métodos deinit, para identificar objetos que não são libertados como esperado.

class MyObject {
    init() {
        print("MyObject initialized")
    }

    deinit {
        print("MyObject deinitialized") // Deve ser chamado ao libertar
    }
}
  • Testes unitários/UI: Criação de testes especializados que verificam se os objetos são libertados corretamente após a conclusão do seu ciclo de vida ou execução de uma tarefa específica. Executar esses testes com Instrument Leaks ou Memory Graph ativados.

  • Revisão de código: Revisão regular do código para detectar potenciais problemas de gestão de memória, como referências cíclicas fortes, uso incorreto de closures (listas de captura) e delegados.

  • Verificação de referências fracas e referências sem propriedade: Garantir que as referências a delegados, closures e outros objetos que possam criar referências cíclicas estejam corretamente marcadas como weak ou unowned.

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent? // Uso de weak para evitar ciclos
}