NSLog o endereço de memória de um objeto no método de descrição substituído

116

Estou substituindo o método de descrição de um objeto. Preciso saber como imprimir o endereço de memória do objeto para substituir {???} no código abaixo:

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

Quero imprimir no console assim:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Undistraction
fonte

Respostas:

212

Para imprimir o endereço, use o %pespecificador de formato e o ponteiro próprio:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Vladimir
fonte
6
usar self com o especificador '% @' realmente causaria recursão, pois isso tornaria o método -description chamado novamente. O especificador% p apenas exibe o endereço do ponteiro
Vladimir
3
Eu tendo a [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- o endereço acaba lá porque o NSObjecttem, mas você também não joga fora nada que você decidiu ser relevante para depuração em quaisquer superclasses das quais você possa estar herdando.
Tommy
7
Observação adicional: %pespera um ponteiro do tipo void *, para o qual você deve lançar de selfvolta void *, caso contrário, ocorrerá um comportamento indefinido.
4
@ user529758: sem necessidade de lançar, sem comportamento indefinido. void *e idinternamente são quase os mesmos e, neste caso, não há diferença se você conjura void *ou não.
Michael de
1
Você deve colocar o símbolo '&' antes do argumento 'self'
Artyom Devyatov
6

O método mais fácil é usar a super descrição

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

Portanto, no caso deste objeto modelo que é uma subclasse de NSObject, você pode evitar trabalho extra e lembrança %p.

Usando manualmente NSStringWithClass () e% p

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

Portanto, no caso de um modelo de objeto no qual você tem um implementador concreto derivado desta classe, você mostrará o nome de classe correto.

Cameron Lowell Palmer
fonte