NSLog адресу пам’яті об’єкта в методі опису, що перекривається


116

Я перекриваю метод опису об'єкта. Мені потрібно знати, як роздрукувати адресу пам'яті об'єкта, щоб замінити {???} у коді нижче:

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

Я хочу, щоб він друкував у консолі так:

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

Відповіді:


212

Для друку адреси використовуйте %pспецифікатор формату та власний покажчик:

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

6
використання self із специфікатором '% @' справді призведе до рекурсії, оскільки це зробить метод -описання знову. Специфікатор% p щойно виводить адресу вказівника
Володимир

3
Я схильний [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- адреса закінчується там, оскільки NSObjectє, але ви також не відкидайте нічого, що вирішили, що має відношення до налагодження в будь-яких суперкласах, від яких ви можете успадкувати.
Томмі

7
Додаткова примітка. %pОчікує, що тип вказівника void *вам доведеться selfповернути void *, якщо не визначене поведінка.

4
@ user529758: немає необхідності робити роль, не визначати поведінку. void *і idвсередині вони майже однакові, і в цьому випадку немає різниці, тим більше ти будеш кидати його void *чи ні.
Майкл

1
Ви повинні поставити символ "&" перед аргументом "само"
Артем Девятов,

6

Найпростіший метод - використовувати супер опис

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

Так що у випадку з цим об'єктом моделі, що є підкласом NSObject, ви можете ухилитися від додаткової роботи та запам'ятовування %p.

Вручну за допомогою NSStringWithClass () та% p

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

Так що у випадку об'єктної моделі, в якій у вас є конкретний реалізатор, який походить від цього класу, ви покажете правильну назву класу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.