26 Abr, 2013 18:37

Dicas para ajudar a depurar o código em Objective-C (Parte 2)

Na maioria das vezes quando estamos depurando o código lançamos mão do NSLog para exibir um conteúdo que queremos. Porém há vezes que necessitamos algo além disso: ver o conteúdo de uma variável ali, na hora da execução. Para isso o Xcode nos permite utilizar comandos da ferramenta de debug chamada LLDB. Você pode obter mais informações sobre a ferramenta neste link.

Primeiro passo: imprimindo valores

Os principais – e, consequentemente, mais utilizados – comandos são o p (para tipos primitivos) e o po (print object) para objetos. O código abaixo mostra a utilização dos dois comandos:

Comandos p e po em uso

No caso de objetos, o debugger imprime o retorno do método description. Já no exemplo abaixo, eu uso o comando p para saber quantas subviews o View Controller possui:

Comando p: exibindo o número de subviews

Comandos avançados

Mas a brincadeira fica mais interessante quando você começa a combinar comandos. Por exemplo, imagine que temos uma classe Pessoa, com uma propriedade chamada peso (float). O método abaixo cria 150 pessoas com pesos variando entre 0 e 200:

Método para criar pessoas

Utilizando o método que filtra arrays usando o método -filteredArrayUsingPredicate:, eu consigo ver no debug a descrição das pessoas que tem o peso maior que 70:

Usando NSPredicate para filtrar um array no debug

O código escrito foi:

po [pessoas filteredArrayUsingPredicate:(NSPredicate *)[NSPredicate predicateWithFormat:@"self.peso > 70"]]

Se você não está familiarizado, o KVC (key-value coding - valores-chave de codificação), permite-nos consultar os arrays utilizando determinados parâmetros, como count ou sum, ou podemos acessar uma propriedade particular de todos os objetos contidos dentro de nossa array.

Alterando valores de variáveis enquanto executa o código

Agora imagine quantas vezes estamos rodando um código, percebemos que o valor está errado, e temos que mandar rodar novamente só por causa disso. Há uma forma de você contornar isso: você pode alterar o valor de uma variável enquanto faz a depuração do código.

Vamos dar um exemplo: imagine que você tem um método que necessita de login e senha. Veja a imagem:

Usando expr para alterar o valor de variáveis

Perceba que utilizando

expr login = @"user2"
expr senha = @"4321"

o valor do segundo NSLog sai diferente do primeiro. Mas o melhor ainda está por vir: é possível utilizar os breakpoints para fazer essa alteração para você. É possível editar o breakpoint da linha 43 da maneira mostrada na próxima imagem:

Usando expr no breakpoint

Perceba que o checkbox no final da janela permite que o código continue sendo executado, sem que ele pare no breakpoint. O melhor é que dessa forma você pode executar comandos do NSLog sem precisar criar macros que validem se está em desenvolvimento ou em produção.

Breakpoints condicionais

Os mais atentos devem ter percebido que na última imagem havia uma caixa de texto chamada Condition. A funcionalidade dela é óbvia: o breakpoint só é ativado caso a condição escrita na caixa de texto seja verdadeira. Veja a próxima imagem:

Usando condicionais no breakpoint

Veja que no laço for eu tenho uma variável de controle i. Eu coloquei no breakpoint um condicional que faz com que o código só pare se a variável tiver o valor 9. Na imagem o código está parado neste momento, e eu aproveitei para escrever no console o resultado de i, para comprovar que o valor estava certo.

Conclusão

Como podemos ver, há várias formas de depurar o código sem encher o projeto de NSLog's, somente utilizando bem os breakpoints. Obviamente, isso vai exigir do programador que ele tenha mais cuidado na hora de tirar ou colocar um novo breakpoint, mas a vantagem disso é que esses testes ficam só para o usuário que está testando, ou seja, não vai para o controle de versão diversos NSLog's que só você entende para que foram criados.

Vale ressaltar também que esse texto é só uma introdução a todas as possibilidades de comandos possíveis a serem utilizados no console do Xcode. Mas com certeza já vai ser um adianto para a vida de muitos. Qualquer dúvida ou sugestão é só colocar nos comentários.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.