Passo a passo – Usando a Ferramenta de Instrumentos da Apple
Este artigo explica como usar a ferramenta Instrumentos da Apple para diagnosticar problemas de memória em um aplicativo iOS compilado com o Xamarin. Demonstra como inicializar o Instrumentos, tirar instantâneos do heap e analisar o aumento da memória. Ele também mostra como usar o Instrumentos para exibir e identificar as linhas exatas do código que causam o problema de memória.
Esta página demonstra como usar a ferramenta de instrumentos do Xcode para diagnosticar um problema de memória em um aplicativo iOS.
Diagnosticando problemas de memória
No Visual Studio para Mac, inicie Instrumentos no item de menu Ferramentas > Iniciar Instrumentos .
Carregue o aplicativo no dispositivo escolhendo o item de menu Executar > upload para dispositivo.
Escolha o modelo Alocações (ícone laranja com caixa branca)
Selecione o aplicativo Demonstração de Memória na lista Escolher um modelo de criação de perfil para: na parte superior da janela. Clique no dispositivo iOS para expandir o menu que mostra os aplicativos instalados.
Pressione o botão Escolher (canto inferior direito da janela) para iniciar Instrumentos. Este modelo mostrará dois itens no painel superior: Alocações e Controlador de VM.
Pressione o botão Gravar (círculo vermelho no canto superior esquerdo) em Instrumentos, o que iniciará o aplicativo.
Selecione a linha Controlador de VM no painel superior (agora que o aplicativo é executado, ele conterá duas seções: Tamanho Residente e Sujo). No painel Inspetor, escolha a opção Mostrar Configurações de Exibição (o ícone de engrenagem) e marque a caixa de seleção Instantâneo Automático, conforme mostrado no canto inferior direito desta captura de tela:
Selecione a linha Alocações no painel superior (agora que o aplicativo é executado, ele indicará Todas as VMs Anônimas e Heap)
No painel Inspetor, escolha a opção Mostrar Configurações de Vídeo (o ícone de engrenagem) e clique no botão Marcar Geração para estabelecer uma linha de base. Um pequeno sinalizador vermelho será exibido na linha do tempo na parte superior da janela
Role o aplicativo e selecione Marcar Geração novamente (repetir algumas vezes)
Clique no botão Parar.
Expanda o nó Geração com o maior Crescimento e classifique por Crescimento (decrescente).
Altere o painel Inspetor para Mostrar Detalhes Estendidos (o "E"), que mostra o Rastreamento de Pilha.
Observe que o nó <não objeto> mostra o crescimento excessivo de memória. Clique na seta ao lado desse nó para ver mais detalhes – clique com o botão direito do mouse no rastreamento de pilha para adicionar Local de Origem ao painel:
Classifique por Tamanho e exiba Detalhes Estendidos:
Clique na entrada desejada na pilha de chamadas para ver o código relacionado:
Nesse caso, uma nova imagem é criada e armazenada em uma coleção para cada célula, nem as células de exibição de coleção existente são reutilizadas.
Resolvendo problemas de memória
É possível resolver esses problemas e executar novamente o aplicativo por meio de Instrumentos.
Ao declarar uma única instância no nível de classe, a imagem pode ser reutilizada e o objeto de célula pode ser reutilizado por meio de um pool existente em vez de ser criado toda vez, conforme mostrado abaixo:
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
// Dequeue a cell from the reuse pool
var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
// Reuse the image declared at the class level
imageCell.ImageView.Image = image;
return imageCell;
}
Agora, quando o aplicativo é executado, o uso de memória é bastante reduzido – o Crescimento entre gerações agora é medido em Kib (quilobytes) em vez de MiB (megabytes), como era antes de corrigir o código:
O artigo Xamarin.iOS Garbage Collection é uma referência útil para lidar com problemas de memória com o Xamarin.iOS.
Resumo
Este artigo demonstrou como usar Instrumentos para diagnosticar problemas de memória. Ele descreveu como iniciar Instrumentos pelo Visual Studio para Mac, carregar o modelo de alocação de memória e passar a usar instantâneos para identificar problemas de memória. Por fim, o aplicativo foi examinado novamente para verificar se que o problema foi corrigido.