NSLoguj adres pamięci obiektu w zastępowanej metodzie opisu

116

Zastępuję metodę opisu obiektu. Muszę wiedzieć, jak wydrukować adres pamięci obiektu, aby zastąpić {???} w poniższym kodzie:

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

Chcę, żeby to wydrukowało w konsoli w ten sposób:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Nieuwaga
źródło

Odpowiedzi:

212

Aby wydrukować adres, użyj %pspecyfikatora formatu i wskaźnika własnego:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Vladimir
źródło
6
użycie self ze specyfikatorem „% @” rzeczywiście spowodowałoby rekurencję, ponieważ spowoduje to ponowne wywołanie metody -description. Specyfikator% p wyświetla tylko adres wskaźnika
Vladimir,
3
Mam tendencję do [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- adres trafia tam, ponieważ NSObjectgo ma, ale nie wyrzucasz też niczego, co zdecydowałeś, że jest istotne dla debugowania w jakichkolwiek nadklasach, z których możesz dziedziczyć.
Tommy
7
Dodatkowa uwaga: %poczekuje wskaźnika typu void *, do którego należy rzutować z selfpowrotem void *, w przeciwnym razie wystąpi niezdefiniowane zachowanie.
4
@ user529758: nie ma potrzeby przesyłania, nie ma niezdefiniowanego zachowania. void *i idsą wewnętrznie prawie takie same, aw tym przypadku nie ma różnicy, czy rzucisz, void *czy nie.
Michael
1
Musisz wstawić symbol „&” przed argumentem „siebie”
Artem Devyatov
6

Najłatwiejszą metodą jest użycie super opisu

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

Więc w przypadku tego obiektu modelu, który jest podklasą NSObject, możesz uniknąć dodatkowej pracy i zapamiętywania %p.

Ręcznie przy użyciu NSStringWithClass () i% p

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

Więc w przypadku modelu obiektowego, w którym masz konkretną implementację, która pochodzi z tej klasy, pokażesz poprawną nazwę klasy.

Cameron Lowell Palmer
źródło