NSLog l'indirizzo di memoria di un oggetto nel metodo di descrizione sostituito


116

Sto sovrascrivendo il metodo di descrizione di un oggetto. Ho bisogno di sapere come stampare l'indirizzo di memoria dell'oggetto per sostituire {???} nel codice seguente:

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

Voglio che venga stampato nella console in questo modo:

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

Risposte:


212

Per stampare l'indirizzo usa l' %pidentificatore di formato e il puntatore automatico:

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

6
l'uso di self con l'identificatore '% @' causerebbe effettivamente la ricorsione in quanto ciò farà chiamare di nuovo il metodo -description. L'identificatore% p restituisce solo l'indirizzo del puntatore
Vladimir

3
Tendo a [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- l'indirizzo finisce lì perché ce l' NSObjectha, ma non butti via nulla che hai deciso sia rilevante per il debug in qualsiasi superclasse da cui potresti ereditare.
Tommy

7
Nota aggiuntiva: %psi aspetta un puntatore di tipo void *, è necessario getto selfdi nuovo a void *, un comportamento indefinito altrimenti si verifica.

4
@ user529758: nessuna necessità di trasmettere, nessun comportamento indefinito. void *e idinternamente sono quasi uguali, e in questo caso non c'è differenza se lo lanci void *o meno.
Michael

1
Devi mettere il simbolo '&' prima dell'argomento 'auto'
Artyom Devyatov

6

Il metodo più semplice è utilizzare la super descrizione

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

Quindi, nel caso di questo oggetto modello che è una sottoclasse di NSObject, puoi schivare il lavoro extra e ricordare %p.

Utilizzando manualmente NSStringWithClass () e% p

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

Quindi, nel caso di un modello a oggetti in cui si dispone di un implementatore concreto derivato da questa classe, verrà visualizzato il nome della classe corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.