Depuração de Xcode - exibindo imagens

99

Adoro usar o depurador Xcode. Você pode dar uma olhada no valor de uma variável e até mesmo alterá-lo.

Mas posso de alguma forma EXIBIR a imagem que é referenciada por uma variável de imagem? Eu sei que posso ver seus bytes brutos, mas seria muito mais amigável exibir uma janela com seu conteúdo.

O Xcode pode não suportar isso. Talvez haja uma ferramenta externa que ajude a exibir imagens?

krasnyk
fonte

Respostas:

273

Use o Quick Look para inspecionar imagens no depurador Xcode.

Selecione NSImageou UIImageno depurador e clique no ícone "olho" do Quick Look.

ícone de "olho" na barra de ferramentas do depurador Xcode

Como outras áreas do OS X, você também pode usar o spacebarQuick Look!

Visualizando uma UIImage no depurador Xcode via Quick Look

O Quick Look no depurador também pode ser implementado para suas próprias classes:

Habilitando Quick Look para tipos personalizados

O recurso Quick Look de variáveis ​​no depurador Xcode permite obter uma avaliação visual rápida do estado de uma variável de objeto por meio de uma renderização gráfica, exibida em uma janela popover na visualização de variáveis ​​do depurador ou no local em seu código-fonte.

Este capítulo descreve como você implementa um método Quick Look para seus tipos de classe personalizados, de modo que as variáveis ​​de objeto desses tipos também possam ser renderizadas visualmente na janela popover Quick Look.

pkamb
fonte
13
Melhor. Característica. Sempre!
Sev
2
Esta é a resposta mais valiosa do ano!
Vedrano
8
Idades codificando no Xcode e eu nunca soube desse recurso! Isso é incrível!!! Muito obrigado
Joan Cardona
2
Sabia sobre esse recurso, mas obrigado pela dica da barra de espaço! Muito mais fácil do que clicar no olho com o mouse. :)
Chintan Patel
1
Trabalhe com o Xcode 10 e o Swift 4.2 como um encanto. Obrigado.
atereshkov
16

EDITAR:

A partir do Xcode 5, o depurador pode mostrar a representação visual das variáveis ​​UIImage / CGImageRef!

O próprio Xcode não pode fazer isso. Não sei sobre ferramentas externas.

O que estou fazendo para testar imagens durante a depuração é converter os dados brutos em um formato de arquivo de imagem, como .png, salvá-lo em algum lugar e abrir a imagem com qualquer ferramenta de visualização de imagens.

Tenho um trecho de código para esse fim, basicamente assim:

NSData *imageData = UIImagePNGRepresentation(self.myUIImage);
[imageData writeToURL:desktopURL atomically:YES];

E estou apenas copiando e colando este código onde desejo ver o conteúdo de uma imagem em execução.

Certifique-se de se livrar deste código o mais rápido possível devido ao alto custo da conversão de UIImageparaNSData

Avi Shukron
fonte
2
apenas curiosidade: por que você diz "(e não deveria) fazer"? Houve uma época em que as pessoas diziam que os computadores "não deveriam" ter telas coloridas, porque eram muito caros, ou que um editor de texto usado por programadores "não deveria" verificar a sintaxe do seu código. em algum ponto precisamos deixar de ideias arcaicas, certo?
não sincronizado de
Ok, então retiro o "não deveria". Eu gostaria que um dia os IDE's interpretassem as imagens durante a depuração.
Avi Shukron,
Esta é uma ótima ideia e apenas me ajudou - obrigado. Meio óbvio quando alguém aponta, mas ainda é um ótimo indicador.
Scott Little,
@unsynchronized você vai olhar para isso ... Xcode 5 pode mostrar imagens no depurador ...
Avi Shukron
14

Editar para o Xcode 5: agora, quando você passa o mouse sobre o nome de uma variável de imagem, há um ícone de "olho" à direita. Basta clicar para ver a imagem atual!

NOTA: às vezes isso falha no Xcode, mesmo se a imagem estiver correta. Se isso acontecer, OU se você não tiver uma variável UIImage (por exemplo, é uma propriedade de outro objeto, você ainda pode usar a resposta mais antiga:

Resposta mais antiga: começando com a resposta de Avraham, tentei alguns experimentos para exibir uma imagem iOS do lldb sem precisar recompilar ou adicioná-la a uma visualização. Eu finalmente pensei em:

e [UIImagePNGRepresentation(myImage) writeToFile:@"/Users/<userName>/Desktop/myImage.png" atomically:NO];

Eu mantenho essa string em um editor de texto e colo quando preciso. Isso armazena a imagem atual na qual estou interessado (neste caso, "myImage") em um arquivo PNG na área de trabalho. Então, posso apenas abrir este arquivo com o Preview.

Se você estiver trabalhando em um dispositivo iOS, poderá usar

 e [UIImagePNGRepresentation(myImage) writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingString:@"/myImage.png"] atomically:NO];

Então você pode usar o Finder; Selecione seu dispositivo; "Arquivos"; em seguida, seu aplicativo de desenvolvimento e copie a imagem para sua área de trabalho para visualizá-la.

Mackworth
fonte
+1000000 Esta é uma solução incrível! Gostaria de acrescentar que, se você estiver depurando no dispositivo, poderá usar algo como iFunBox ou iExplorer para recuperar a imagem do dispositivo.
Quentin
Você pode até escrever diretamente para "/ Usuários / <seu nome de usuário> /"; desta forma, você não terá que procurar sua pasta temporária através de GUIDs
Dannie P
Boa sugestão (observe que você deve usar / Users / <seu nome de usuário> /, não funciona com ~ /). Atualizou a sugestão de acordo.
mackworth
Excelente sugestão @mackworth. Obrigado.
arango_86
13

Se você gosta de trabalhar com o console lldb, use cinzel comando "visualizar"

dica:

após a instalação, você pode definir um ponto de interrupção condicional após definir o UIImage com a ação: "visualizar myUIImageToShowWithQuickLook"

insira a descrição da imagem aqui

isso mostrará a imagem automaticamente quando o depurador parar.

Zaster
fonte
4

E se você não conseguir acessar a imagem por meio da visualização de variáveis?

Ecoando o que @pkamb disse - você pode usar a visualização de variáveis ​​para ver rapidamente uma imagem. Mas e se você não conseguir chegar à imagem?

por exemplo, tenho uma imagem em (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

mas se eu tentar expandir contentViewControllerna visão variável, não expõe minhas subvisões

insira a descrição da imagem aqui

o que você pode fazer é clicar com o botão direito, adicionar uma expressão, e então você pode vê-la!

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

wyu
fonte
Então você deve ser capaz de usar o mesmo comando acima: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] as? UIImageView) .image) writeToFile: @ "/ Users / <userName> / Desktop /watchImage.png "atomicamente: NÃO];
Mackworth
-7

Você pode colocar um ponto de interrupção na linha de sua imagem e, em seguida, no depurador, basta escrever:

po your_UIImage_object

posignifica print object, é um comando GDB que irá mostrar várias informações úteis sobre o objeto passado, no seu caso a imagem.

Malloc
fonte
1
Na verdade, usar po com o objeto UIImage diretamente só imprimirá no console o endereço de memória do nome da classe da instância. Algo como: <UIImage: 0x7fc98df6c7d0>
Daniel