Qual é o equivalente em Objective-C para "toString ()", para uso com o NSLog?

170

Existe um método que eu possa substituir em minhas classes personalizadas para que, quando

      NSLog(@"%@", myObject) 

é chamado, ele imprimirá os campos (ou o que eu julgar importante) do meu objeto? Acho que estou procurando o equivalente em Objective-C do Java toString().

George Armhold
fonte

Respostas:

250

É o descriptionmétodo da instância, declarado como:

- (NSString *)description

Aqui está um exemplo de implementação (graças ao grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
fonte
5
Observe que se você estiver usando CoreData, a descriptionpropriedade é reservada ... e fornecerá informações úteis sobre depuração! Nesse caso, você precisará criar seu próprio nome de método exclusivo.
quer
debugDescriptionTambém é reservado? Embora eu DebugDescriptiondeva ser usado por um depurador como o LLDB.
MaddTheSane
36

Adicione isso à @implementationsua classe Photo:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}
Grahamparks
fonte
24

Você pode substituir o método de descrição do NSObject:

- (NSString *)description

Sobre o assunto do registro, eu recomendo este post do blog para um melhor registro no Objective-C.

teabot
fonte
4
Este não é um método estático? Eu gostaria que isso operasse em objetos e não na classe. Por exemplo, se eu tiver uma classe "Foto", com os campos "nome" e "autor", gostaria que o NSLog imprima esses campos conforme eles são atribuídos no objeto.
George Armhold 9/07/2009
2
Sim - bem localizado - pressionei a tecla errada. Eu claramente deveria prestar mais atenção ao revisar minhas respostas. Felizmente alguém estava de olho na bola :-)
teabot
13

Existem duas funções que você pode usar.

- (NSString*)description

Isso será exibido quando você colocar seu objeto como, por exemplo, um parâmetro para NSLog. A outra função de descrição é:

- (NSString*)debugDescription

Isso será chamado quando você fizer po anInstanceOfYourClassna janela de comando debug. Se sua classe não tem uma debugDescriptionfunção, bastadescription será chamada.

Observe que a classe base NSObjectfoi descriptionimplementada, mas é bastante simples: exibe apenas o endereço do objeto. É por isso que recomendo que você implemente descriptionem qualquer classe da qual deseja obter informações, principalmente se você usar o descriptionmétodo no seu código. Se você usa descriptionseu código, sugiro que você implemente debugDescriptiontambém, tornando também debugDescriptionmais detalhado.

MaddTheSane
fonte
1

Isso produzirá as vozes disponíveis:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
grigb
fonte