De que se trata o artigo

Este artigo apresenta inicialmente um conjunto de conceitos a respeito do gerenciamento de memória. Em seguida, é apresentado o Static Analyser, uma ferramenta baseada no projeto open-source Clang Static Analyser. Esta ferramenta funciona como um compilador, analisando o código e apontando erros lógicos e trechos que não seguem as melhores práticas.

Em que situação o tema é útil

O tema é útil para desenvolvedores de nível intermediário e avançado que buscam uma forma efetiva de otimizar suas aplicações e resolver os problemas mais variados no ciclo de desenvolvimento, além de servir como um atalho no aprendizado de algumas ferramentas que possuem uma documentação extensa e nem sempre amigável.

Performance em aplicações iOS

O objetivo deste artigo é introduzir ao leitor as principais ferramentas para análise e otimização de performance para plataforma móvel da Apple, além de mostrar um conjunto de boas práticas que auxiliam e previnem problemas no decorrer do desenvolvimento.

Após o lançamento do sistema operacional iOS (iPhone Operational System) em 2007, diversas melhorias em seu SDK foram introduzidas de maneira a facilitar a vida dos desenvolvedores, permitindo que estes percam menos tempo resolvendo problemas de codificação e foquem no desenvolvimento de suas aplicações. Uma das principais melhorias, introduzida em 2011 junto com a versão 5.0, foi a contagem automática de referências ou ARC (ver Nota do DevMan 1), que livrou os programadores da difícil tarefa de tomar conta do ciclo de vida de cada objeto, onde simples deslizes poderiam resultar em problemas extremamente complexos de se resolver.

Nota DevMan 1. Automatic Reference Count

Antes do lançamento da versão 5 do iOS SDK, todo desenvolvedor precisava conhecer as regras básicas de gerenciamento de memória, se preocupando com a quantidade de referências existentes para cada objeto criado e garantindo a liberação destes após a sua utilização. Caso esta regra fosse esquecida, problemas dos mais variados ocorriam na execução do código. Com a introdução do ARC, este trabalho é executado pelo compilador LLVM, que insere em tempo de compilação os comandos necessários para liberar cada objeto criado.

Contudo, o desenvolvedor ainda é responsável por gerenciar os recursos do sistema de forma efetiva, como memória, processador, disco e rede. Muitos acreditam que esta tarefa pode ser negligenciada, porém, devemos estar cientes dos diversos modelos de dispositivos encontrados no mercado, além das diferenças entre o simulador e o hardware em si (ver Nota do DevMan 2).

Nota DevMan 2. Simulador x Dispositivos

O compilador utilizado pelo Xcode possui a função de Cross-Compiler, permitindo a criação do código executado no simulador no padrão x86 (Intel 8086) e nos dispositivos o mesmo utiliza o padrão ARM (Adanced RISC Machine). Esta diferença também é importante quando criamos bibliotecas utilitárias, pois estas devem ser compiladas em ambos os padrões, com o risco de não funcionar em um dos ambientes.

Quando distribuímos nossas aplicações, nos deparamos com uma realidade totalmente diferente de nosso ambiente de desenvolvimento, onde os recursos são relativos à máquina do desenvolvedor e dos dispositivos utilizados para teste. Em contrapartida, nos diversos dispositivos onde a aplicação pode ser executada, os recursos nem sempre são abundantes e por isto, o sistema operacional, através do mecanismo watchdog, faz um monitoramento agressivo em busca de processos que fazem uso indevido destes, e no pior dos casos, ocorre o fechamento da aplicação.

Aqueles que possuem uma aplicação publicada sabem a difícil batalha travada diariamente a cada versão lançada junto aos usuários, cada vez mais exigentes, e em caso de problemas, não medem esforços ao enviar suas críticas e avaliações negativas, afetando em alguns casos o lucro e a imagem do desenvolvedor ou empresa, pois estas avaliações funcionam como uma vitrine de nome ou marca.

Para evitarmos dores de cabeça, se torna imprescindível conhecer o mínimo necessário para a correta execução em todos os dispositivos suportados e como agir em caso de problemas intermitentes, que muitas vezes só podem ser detectados com a ajuda de ferramentas específicas.

Ao conhecermos as ferramentas corretas para análise e otimização de nosso código, evitamos passar incontáveis horas com depuração em busca de problemas, nem sempre fáceis de encontrar, e utilizamos este tempo para o que realmente importa: a construção de nossas aplicações.

O gerenciamento de memória

Antes de utilizarmos as diversas ferramentas disponíveis para monitoramento e otimização de nossas aplicações, precisamos conhecer os fundamentos por trás do gerenciamento de memória no iOS. Este permite alternar entre as aplicações em execução sem a necessidade de seu fechamento, mantendo estas em memória até que exista a necessidade de liberação de recursos ou ocorra o fechamento explícito por parte do usuário.

Caso a memória disponível não seja suficiente para a execução do sistema e das aplicações em execução, o sistema operacional busca por recursos já não utilizados e tenta recuperá-los. Caso estes não sejam suficientes, ocorre uma varredura nas aplicações em segundo plano e aquelas que ocupam mais recursos e não são utilizadas pelo usuário há mais tempo são finalizadas. Este processo se repete até que a quantidade necessária de memória seja alcançada.

A memória total dos dispositivos é dividida de uma forma que permita ao sistema agilizar o carregamento de novas aplicações e restaurar a execução de uma aplicação em segundo plano de uma maneira otimizada. Para isto, são criadas algumas áreas em memória que funcionam como um link lógico entre a memória física e o código carregado (ver ...

Quer ler esse conteúdo completo? Tenha acesso completo