Como visualizar o conteúdo da variável NSDictionary no depurador Xcode?

85

Existe uma maneira de visualizar os pares de chave / valor de uma variável NSDictionary por meio do depurador Xcode? Esta é a extensão das informações quando totalmente expandidas na janela de variáveis:

Variable  Value      Summary
jsonDict  0x45c540   4 key/value pairs
 NSObject {...}
  isa     0xa06e0720

Eu esperava que ele me mostrasse cada elemento do dicionário (semelhante a uma variável de matriz).

Dara Kong
fonte

Respostas:

140

Na janela gdb, você pode usar popara inspecionar o objeto.

dado:

NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"foo" forKey:@"bar"];
[dict setObject:@"fiz" forKey:@"buz"];

definindo um ponto de interrupção após os objetos serem adicionados, você pode inspecionar o que está no dicionário

(gdb) po dict
{
  bar = foo;
  buz = fiz;
}

É claro que esses são NSStringobjetos que imprimem bem. YMMV com outros objetos complexos.

craigb
fonte
7
Oi! O que é gdb? O que é po? Não tenho certeza de entender ... Obrigado pela ajuda! :)
Martin
1
Ok, então descobri que GDB significa GNU debugger e, na verdade, é a janela do depurador do Xcode. Agora eu preciso encontrar o que é po
Martin
18
ESTÁ BEM! Portanto, gdb é na verdade um prompt no Console, onde você pode inserir comandos. Ao digitar "po object_name" você obtém o conteúdo do objeto impresso no console.
Martin
7
po é um alias para print-object
Brad Cupit
Maravilhoso! Equivalente a "echo var_dump ()" ou "print_r ()" em PHP.
mpemburn de
30

Você pode clicar com o botão direito em qualquer variável de objeto (ObjC ou Core Foundation) e selecionar “Imprimir Descrição no Console” (também em Executar-> Visualização de Variáveis). Isso imprime o resultado do -debugDescriptionmétodo do obejct , que por padrão chama -description. Infelizmente, NSDictionarysobrescreve isso para produzir um monte de dados internos com os quais você geralmente não se preocupa, então, neste caso específico, a solução de Craigb é melhor.

As chaves e valores exibidos também são usados -description, portanto, se você quiser informações úteis sobre seus objetos em coleções e em outros lugares, substituí -description- los é uma necessidade. Eu geralmente implemento ao longo destas linhas, para combinar com o formato da NSObjectimplementação padrão :

- (NSString *) descrição
{
    return [NSString stringWithFormat: @ "<% @% p> {foo:% @}", [self class], self, [self foo]];
}
Jens Ayton
fonte
6

Você pode usar CFShow ()

NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"foo" forKey:@"bar"];
[dict setObject:@"fiz" forKey:@"buz"];
CFShow(dict);

Na saída você verá

{
  bar = foo;
  buz = fiz;
}
uranpro
fonte
3

O XCode 4.6 adicionou a seguinte funcionalidade que pode ser útil para você

The elements of NSArray and NSDictionary objects can now be inspected in the Xcode debugger

Agora você pode inspecionar esses tipos de objeto sem precisar imprimir o objeto inteiro no console. Apreciar!

Fonte: http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_6.html

jkatzer
fonte
Este é um bug para mim - mostra apenas parte do meu NSDictionary
Paul Slocum
1

Clique no seu ditado e, em seguida, clique no pequeno ícone "i", ele deve fazer o trabalho :-) Xcode5, ver o valor de um dict

Taiko
fonte
1

Se você quiser imprimir isso em uma ação de ponto de interrupção no XCode moderno (sim, estou 10 anos após a postagem original!), Use a seguinte expressão de ponto de interrupção em uma ação de "Mensagem de Log":

@ myDictionary.description @

Abaixo está uma captura de tela da minha ação de ponto de interrupção, onde o evento da variável é um NSString e a variável contextData é o NSDictionary do qual estou registrando o conteúdo :

Pat
fonte
0

Você também pode usar NSLog .

Além disso, você pode ir na área de depuração ou xcode, descobrir All Variables, Registers, Globals and Staticse selecionar sua variável. Clique com o botão direito nele. Então selecionePrint description of "...."

Espero que ajude!

user1873574
fonte