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

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];
}

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.