NSLog die Speicheradresse eines Objekts in der überschriebenen Beschreibungsmethode

116

Ich überschreibe die Beschreibungsmethode eines Objekts. Ich muss wissen, wie die Speicheradresse des Objekts gedruckt wird, um {???} im folgenden Code zu ersetzen :

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

Ich möchte, dass es wie folgt in der Konsole gedruckt wird:

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

Antworten:

212

Verwenden Sie zum Drucken der Adresse den %pFormatbezeichner und den Selbstzeiger:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Vladimir
quelle
6
Die Verwendung von self mit dem Bezeichner '% @' würde in der Tat eine Rekursion verursachen, da dadurch die Methode -description erneut aufgerufen wird. % p Spezifizierer gibt nur Zeigeradresse aus
Vladimir
3
Ich neige dazu [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- die Adresse landet dort, weil NSObjectsie es hat, aber Sie werfen auch nichts weg, von dem Sie entschieden haben, dass es für das Debuggen in Superklassen relevant ist, von denen Sie möglicherweise erben.
Tommy
7
Zusätzlicher Hinweis: %pErwartet einen Zeiger vom Typ void *, auf den Sie selfzurückgreifen müssen void *, da sonst undefiniertes Verhalten auftritt.
4
@ user529758: kein Casting erforderlich, kein undefiniertes Verhalten. void *und idsind intern fast gleich, und in diesem Fall gibt es keinen Unterschied, ob Sie es werfen void *oder nicht.
Michael
1
Sie müssen das Symbol '&' vor das Argument 'self' setzen
Artyom Devyatov
6

Die einfachste Methode ist die Verwendung der Super-Beschreibung

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

Bei diesem Modellobjekt, das eine Unterklasse von NSObject ist, können Sie zusätzlicher Arbeit und Erinnerung ausweichen %p.

Manuelles Verwenden von NSStringWithClass () und% p

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

Bei einem Objektmodell, in dem Sie einen konkreten Implementierer haben, der von dieser Klasse abgeleitet ist, wird der richtige Klassenname angezeigt.

Cameron Lowell Palmer
quelle