¿Cuál es el equivalente de Objective-C para "toString ()", para usar con NSLog?

170

¿Hay algún método que pueda anular en mis clases personalizadas para que cuando

      NSLog(@"%@", myObject) 

se llama, imprimirá los campos (o lo que considere importante) de mi objeto? Supongo que estoy buscando el equivalente de Objective-C de Java toString().

George Armhold
fuente

Respuestas:

250

Es el descriptionmétodo de instancia, declarado como:

- (NSString *)description

Aquí hay un ejemplo de implementación (gracias a grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
fuente
55
Tenga en cuenta que si está utilizando CoreData, la descriptionpropiedad está reservada ... ¡y proporcionará información útil de depuración! En ese caso, deberás crear tu propio nombre de método único.
Trepatroncos
¿ debugDescriptionTambién está reservado? Aunque creo que DebugDescriptionse supone que debe ser utilizado por un depurador como LLDB.
MaddTheSane
36

Agregue esto a @implementationsu clase de Foto:

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

Puede anular el método de descripción de NSObject:

- (NSString *)description

Sobre el tema del registro, recomiendo esta publicación de blog para un mejor registro en Objective-C.

teabot
fuente
44
¿No es este un método estático? Me gustaría que esto funcione en objetos en lugar de la clase. Por ejemplo, si tengo una clase "Foto", con los campos "nombre" y "autor", me gustaría que NSLog imprima esos campos a medida que se asignan en el objeto.
George Armhold
2
Sí, bien visto, presioné la tecla equivocada. Claramente debería prestar más atención cuando corrija la lectura de mis respuestas. Afortunadamente alguien tenía su ojo en la bola :-)
teabot
13

Hay dos funciones que puede usar.

- (NSString*)description

Esto se mostrará cuando coloque su objeto como, IE un parámetro para NSLog. La otra función de descripción es:

- (NSString*)debugDescription

Esto se llamará cuando lo haga po anInstanceOfYourClassen la ventana de comando de depuración. Si su clase no tiene una debugDescriptionfunción, solo descriptionse le llamará.

Tenga en cuenta que la clase base se NSObjectha descriptionimplementado, pero es bastante básica : solo muestra la dirección del objeto. Es por eso que le recomiendo que implemente descriptionen cualquier clase de la que desee obtener información, especialmente si usa el descriptionmétodo en su código. Si lo usa descriptionen su código, le sugiero que lo implemente debugDescriptiontambién, y que sea debugDescriptionmás detallado.

MaddTheSane
fuente
1

Esto generará las voces disponibles:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Grigb
fuente