Sobreescribir método description de NSObject

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 🙂

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s