NSRegistrar la dirección de memoria de un objeto en el método de descripción anulado

116

Estoy anulando el método de descripción de un objeto. Necesito saber cómo imprimir la dirección de memoria del objeto para reemplazar {???} en el siguiente código:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

Quiero que se imprima en la consola así:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Distracción
fuente

Respuestas:

212

Para imprimir la dirección, use el %pespecificador de formato y el puntero automático:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Vladimir
fuente
6
usar self con el especificador '% @' de hecho causaría recursividad, ya que eso haría que el método -description llamara nuevamente. El especificador% p solo muestra la dirección del puntero
Vladimir
3
Tiendo a [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];: la dirección termina allí porque la NSObjecttiene, pero tampoco tira nada que haya decidido que es relevante para la depuración en las superclases de las que pueda estar heredando.
Tommy
7
Nota adicional: %pespera un puntero de tipo void *, debe selfvolver a lanzar void *, de lo contrario, se produce un comportamiento indefinido.
4
@ user529758: no es necesario emitir, no hay comportamiento indefinido. void *e idinternamente son casi iguales, y en este caso no hay diferencia entre lanzarlo void *o no.
Michael
1
Tienes que poner el símbolo '&' antes del argumento 'yo'
Artyom Devyatov
6

El método más sencillo es utilizar la súper descripción

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

Entonces, en el caso de este objeto modelo que es una subclase de NSObject, puede esquivar trabajo adicional y recordar %p.

Usando manualmente NSStringWithClass () y% p

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}

Entonces, en el caso de un modelo de objeto en el que tiene un implementador concreto que se deriva de esta clase, mostrará el nombre de clase correcto.

Cameron Lowell Palmer
fuente