En Objetive C cuando definimos nuestras clases heredamos de NSObject la cual cuenta con un método llamado description (similar al toString de otros lenguajes de programación) y cuando es llamado desde NSLog despliega por defecto el nombre de la clase y una dirección en memoria pero este comportamiento se puede cambiar sobreescribiendo el método.
Vamos a utilizar una clase llamada «Person» con la siguiente definición
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject // propiedades @property NSString *name; @property NSString *lastName; @property NSString *country; // constructor - (id) initWithName: (NSString *) name lastName: (NSString *) lastName country: (NSString *) country; @end
Person.m
#import "Person.h" @implementation Person // constructor - (id) initWithName: (NSString *) name lastName: (NSString *) lastName country: (NSString *) country { if (self = [super init]) { // se establecen los valores _name = name; _lastName = lastName; _country = country; } return self; } @end
Ahora en el main.m vamos a contar con el siguiente código
#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { // Se crea una instancia Person *carlos = [[Person alloc] initWithName:@"Carlos" lastName:@"Castro" country:@"Costa Rica"]; // se llama el método description NSLog(@"%@",carlos); } return 0; }
Cuando ejecutamos vamos a obtener un mensaje similar al siguiente en nuestra consola
2015-12-10 21:50:32.831 Método description Objetive C[5378:294216] <Person: 0x1005001e0> Program ended with exit code: 0
Pero nosotros estamos buscando que nos despliegue la información de nuestro objeto y para esto vamos a sobreescribir el método description en Person.m
// se sobreescribe el método - (NSString *) description { return [NSString stringWithFormat:@"<Person: name: %@ lastname: %@, country: %@>",_name,_lastName,_country]; }
Como podemos observar estamos indicando que devuelva un NSString con cierto formato y ahora cuando ejecutamos obtendremos un resultado similar al siguiente
</pre> 2015-12-10 21:19:18.967 Método description Objetive C[4910:277991] <Person: name: Carlos lastname: Castro, country: Costa Rica> Program ended with exit code: 0
Observemos que ya no aparece la dirección en memoria si no que se despliega la información de nuestro objeto con el formato especificado pero acá estamos realizando una acción de una manera no tan óptima y es cuando establecemos el nombre de nuestra clase que colocamos la palabra como un dato «quemado» pero qué sucedería si cambiamos el nombre bueno tendríamos que actualizar ese dato y puede que se nos olvide, para solucionar esto ObjetiveC al igual que otros lenguajes cuenta con introspección la cual es una característica que nos permite obtener información de nuestros objetos en tiempo de ejecución.
Vamos a ir a Person.m y cambiaremos el valor retornado en el método description
return [NSString stringWithFormat:@"<%@: name: %@ lastname: %@, country: %@>",[self class],_name,_lastName,_country];
Podemos observar que cambiamos la palabra «Person» por lo que nos devuelva [self class] que será el nombre de la clase.
Bueno hemos aprendido a sobreescribir el método description de NSObject, el código está disponible en Github hasta la próxima 🙂