Boa tarde, hoje trago a atenção para a segunda parte do artigo sobre aplicativos de depuração no LLDB.
Na primeira parte, descobrimos como usar pontos de interrupção no Xcode para modificar as propriedades existentes das variáveis e adicionar uma linha de código através de comandos de instrução.
Criei intencionalmente um projeto de demonstração com alguns erros para descobrir como usar diferentes tipos de pontos de interrupção no LLDB para depurar o aplicativo.
Se você não estudou a primeira parte do artigo, é melhor começar com ele. Deixe-me lembrá-lo de uma regra importante deste tutorial: Até o final deste artigo, você não para o compilador e não reinicia o aplicativo após o primeiro lançamento. Você corrige erros durante a execução do programa.
Pontos de controlePortanto, o seguinte erro no aplicativo:
3. Você pode carregar postagens mais de 7 vezes.Como reproduzir o erro:
- Ligue a Internet no seu iPhone / simulador
- Role até o final da tabela para carregar mais postagens.
- Você pode carregar postagens mais de 7 vezes (embora, neste aplicativo, o usuário não deva ter essa oportunidade).
Como uma das opções para detectar erros, você precisa descobrir como a variável inteira
pageNumber é atualizada após o carregamento de novas postagens na página. Como você ainda não está familiarizado com o meu código, você precisa dedicar algum tempo para entender o que está acontecendo nele.
Não se preocupe. Aplique um pouco de mágica.
Desde a primeira parte do artigo, aprendemos que a solicitação GET HTTP é executada na seção
Rede de marca pragma . Ele contém exatamente uma função
loadPosts . Coloque um ponto de interrupção na primeira linha desta função e arraste a tabela para baixo para atualizar. O compilador irá parar nesse ponto de interrupção.
Objetivo-c
SwiftNa janela inferior do depurador, clique no botão "Mostrar variáveis". Uma nova janela aparecerá à esquerda, na qual você verá todas as variáveis PostsTableViewController.

Aponte o cursor para pageNumber, clique com o botão direito do mouse e selecione “Watch _pageNumber” / “Watch pageNumber” para Objective-C e Swift, respectivamente.
Objetivo-c
SwiftAssim, você criou o chamado ponto de controle para a variável pageNumber. O ponto de controle é um tipo de ponto de interrupção que interrompe o depurador toda vez que o valor da variável é definido como alterado.
Objetivo-c
SwiftContinue o programa. O depurador para e você vê algo como o seguinte:
Objetivo-c
- Registra valores antigos e novos da variável pageNumber .
- Rastreando uma pilha de código que altera o valor da variável pageNumber .
- O ponto atual que causou a alteração da variável pageNumber é o método setter dessa variável.
Se você se referir à etapa 1 no rastreamento de pilha, ela o levará ao seguinte snippet de código:
Swift
- O depurador informa que o ponto de observação que você definiu revelou algo.
- Rastreando uma pilha de código que altera o valor da variável pageNumber .
- O ponto atual que causou a alteração da variável pageNumber é a função updateForNetworkCallEnd .
É lógico concluir que toda vez após uma solicitação HTTP GET bem-sucedida, a variável
pageNumber é incrementada em 1 até que a variável de
estado (do tipo enum) esteja no estado "ativo". Essa variável pode ter 2 estados: ativo ("ativo") ou inativo ("inativo"). O estado "ativo" significa que o usuário pode carregar postagens (ou seja, o limite de 7 downloads não foi atingido). O estado "inativo", pelo contrário, pressupõe que o usuário não poderá mais carregar postagens. Como resultado, precisamos adicionar lógica à função
updateForNetworkCallEnd , que verificaria a variável
pageNumber e
definiria a variável
state para o estado apropriado.
Como você deve ter adivinhado, é muito mais fácil testar a hipótese primeiro sem parar o compilador antes de fazer alterações no código.
Observo que na seção
Suporte da marca pragma já temos a função de que precisamos (
setToInactiveState ), que define a variável de
estado como "inativa".
Adicione um ponto de interrupção uma linha acima da condição
if . Adicione também o seguinte comando de instrução ao depurador.
Objetivo-cexpression if (self.pageNumber >= 7) {[self setToInactiveState]}
Swift expression if (self.pageNumber >= 7) {setToInactiveState()}

Depois disso, exclua o primeiro ponto de interrupção usado para definir o ponto de observação. Desative também o próprio ponto de controle.
Objetivo-c
Objetivo-c
Swift
SwiftAgora role as tabelas para cima, arraste para baixo para atualizar e começar a virar.
Tudo deu certo! Mas é muito cedo para comemorar, ainda temos um bug para corrigir!
O que vem a seguir?A terceira parte final do artigo, na qual aprendemos sobre outro tipo de pontos de interrupção - simbólico (pontos de interrupção simbólicos).