Xcode Debugger: ver o valor da variável

107

Meu código em um UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Como posso ver os valores de delegate.myDataou indexPath.rowno Debugger? delegate.myDatadeve ser uma matriz e indexPath.rowum int. Só consigo ver endereços de memória dos objetos delegatee, indexPathmas onde estão myDatae row?

texto alternativo

Manni
fonte

Respostas:

142

Verifique isto como visualizar o conteúdo da variável NSDictionary no depurador Xcode?

Eu também uso

po variableName
print variableName

no console.

No seu caso é possível executar

print [myData objectAtIndex:indexPath.row]  

ou

po [myData objectAtIndex:indexPath.row]
Andriy
fonte
Obrigado! Eu tento muito: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Mas sempre eu recebeu a mensagem "Não há nenhum membro com nome de linha." Isso funciona: "print indexPath" e "po indexPath". Portanto, tentei usar "[]" em vez de ".": "Po [indexPath row]" -> "Não é possível imprimir a descrição de um objeto NIL." "po [indexPath getRow]" -> "O destino não responde a este seletor de mensagem." :-(
Manni
4
try print (int) [indexPath row]
Andriy
po [myData objectAtIndex: (int) [indexPath row]]
Andriy
@VanDuTran Tenho certeza de que o equivalente a po objno swift é po print(obj).
Chris,
Isso também era perfeito para localizar os valores das propriedades calculadas. Obrigado!
Paula Hasstenteufel
25

Eu concordo com outros participantes que o Xcode como um ambiente de desenvolvimento deve incluir uma maneira fácil de depurar variáveis. Bem, boas notícias, existe uma!

Depois de pesquisar e não encontrar uma resposta / tutorial simples sobre como depurar variáveis ​​no Xcode, fui explorar com o próprio Xcode e achei esta descoberta (pelo menos para mim) muito útil.

Como depurar facilmente suas variáveis ​​no Xcode 4.6.3

Na tela principal do Xcode, certifique-se de ver a área de depuração inferior clicando no botão do canto superior direito mostrado na imagem.

Botão da área de depuração

Área de depuração no Xcode 4.6.3

Agora defina um Breakpoint - a linha em seu código onde você deseja que seu programa pause, clicando na borda de sua área de código.

Breakpoint

Agora, na área de depuração, procure estes botões e clique no do meio. Você notará que sua área agora está dividida em duas.

Dividir área de depuração

Deve ser assim

Agora execute seu aplicativo.

Quando o primeiro Breakpoint for alcançado durante a execução do seu programa, você verá do lado esquerdo todas as suas variáveis ​​disponíveis naquele breakpoint.

Campo de Pesquisa

Você pode expandir as setas para a esquerda na variável para obter mais detalhes. E ainda use o campo de pesquisa para isolar a variável desejada e vê-la mudar em tempo real conforme você "entra" no escopo do Breakpoint.

Entrar

No lado direito da sua área de depuração, você pode enviar para imprimir as variáveis ​​conforme desejar, clicando com o botão direito do mouse sobre a variável desejada.

Menu Contextual

Como você pode ver, esse menu contextual está cheio de opções de depuração muito interessantes. Como o Watch que já foi sugerido com comandos digitados ou mesmo Editar Valor ... que altera o valor de tempo de execução de sua variável!

Lex L.
fonte
21

Você também pode:

  1. Defina um ponto de interrupção para pausar a execução.
  2. O objeto deve estar dentro do escopo de execução
  3. Mova o ponteiro do mouse sobre o objeto ou variável
  4. Uma dica de ferramenta amarela aparecerá
  5. Mova o mouse sobre a dica de ferramenta
  6. Clique sobre as duas pequenas setas apontando para cima e para baixo
  7. Um menu de contexto irá aparecer
  8. Selecione "Imprimir Descrição", irá executar uma [descrição do objeto]
  9. A descrição aparecerá na saída do console

IMHO um pouco escondido e pesado ...

Homem leve
fonte
Em meu xcode "Descrição de impressão" não está funcionando, então como posso ativá-lo?
Kirtikumar A.
@kirtiavaiya o aplicativo deve estar em pausa e sua variável precisa estar dentro do escopo atual para ser impressa. Além disso, você não pode imprimir "self.variable" diretamente, mas pode usar a solução Andriy para imprimir _ <nome da variável>. Por exemplo: para self.btnHello escreva no console "po _btnHello" (isso só funciona se você não alterou o nome do método getter)
LightMan
@LightMan sim, é como você disse, mas também não está funcionando
Kirtikumar A.
10

Sua confusão origina-se do fato de que as propriedades declaradas não são (necessariamente nomeadas o mesmo que) (instância) variáveis.

A expressão

indexPath.row

é equivalente a

[indexPath row]

e a atribuição

delegate.myData = [myData objectAtIndex:indexPath.row];

é equivalente a

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

assumindo nomenclatura padrão para propriedades sintetizadas.

Além disso, delegateé provavelmente declarado como sendo do tipo id<SomeProtocol>, ou seja, o compilador não foi capaz de fornecer informações de tipo reais para delegateaquele ponto, e o depurador está contando com as informações fornecidas em tempo de compilação. Como idé um tipo genérico, não há informações de tempo de compilação sobre as variáveis ​​de instância em delegate.

Essas são as razões pelas quais você não vê myDataou rowcomo variáveis.

Se você deseja inspecionar o resultado do envio -rowou -myData, pode usar comandos pou po:

p (NSInteger)[indexPath row]
po [delegate myData]

ou use a janela de expressões (por exemplo, se você sabe que delegateé do tipo real MyClass *, você pode adicionar uma expressão (MyClass *)delegateou clicar com o botão direito delegate, escolher View Value as…e digitar o tipo real de delegate(por exemplo MyClass *).

Dito isso, concordo que o depurador poderia ser mais útil:

  • Pode haver uma opção para dizer à janela do depurador para usar informações de tipo de tempo de execução em vez de informações de tempo de compilação. Isso tornaria o depurador mais lento, é verdade, mas forneceria informações úteis;

  • As propriedades declaradas podem ser mostradas em um grupo denominado propriedades e permitir a inspeção (opcional) diretamente na janela do depurador. Isso também tornaria o depurador mais lento devido à necessidade de enviar uma mensagem / executar um método para obter informações, mas também forneceria informações úteis.

Chris G.
fonte
Obrigado pela sua explicação! Isso me ajudou muito! :-)
Manni de
7

Você pode imprimir valores na janela do console em tempo de execução. Abaixo estão as etapas:

  1. Coloque um ponto de interrupção para o qual deseja obter valores
  2. Agora execute a depuração passo a passo.
  3. Coloque um cursor na variável / delegado cujo valor deve ser verificado em tempo de execução.
  4. Agora, isso vai mostrar a descrição da variável / delegado
  5. Clicar em "i" mostrará uma descrição detalhada
  6. Isso também imprimirá detalhes na janela do console.

Captura de tela para imprimir detalhes na janela do console

Jayprakash Dubey
fonte
1
Isso funciona no swift, sou novo no swift e não consigo ver os valores do objeto como usamos para ver no obj c.
umairhhhs
1
@umairhhhs Esta postagem é apenas para Objective-C.
Jayprakash Dubey
1
Estou me perguntando por que isso não está no editor rápido, porque isso ajudou muito e economizou tempo.
umairhhhs
1

Isso fica um pouco complicado. Esses objetos são classes ou estruturas customizadas, e olhar dentro deles não é tão fácil no Xcode como em outros ambientes de desenvolvimento.

Se eu fosse você, faria NSLog os valores que você quer ver, com alguma descrição.

ie:

NSLog(@"Description of object & time: %i", indexPath.row);
Aurum Aquila
fonte
11
Sim, NSLog é uma possibilidade, mas não uma alternativa confortável para depuração. Estou muito surpreso que não haja como exibir os valores desejados. Isso pertence à funcionalidade básica de um ambiente de desenvolvimento.
Manni
2
A coisa mais irritante sobre o XCode. Patético.
ryan0,
1

Experimente Executar-> Mostrar-> Expressões

Digite o nome da matriz ou o que estiver procurando.

tbone
fonte
Obrigado! Eu inseri "indexPath.row" e "delegate.myData" na janela de expressão, mas sempre aparece "fora do escopo" na coluna "Resumo" :-(
Manni
np, tive o mesmo problema até encontrá-lo;)
tbone
1
defina um ponto de interrupção logo após definir seu array ou qualquer outra coisa e você deve encontrar o valor em Expressões. Boa sorte
tbone