NS - запись адреса памяти объекта в метод переопределенного описания

116

Я переопределяю метод описания объекта. Мне нужно знать, как напечатать адрес памяти объекта, чтобы заменить {???} в приведенном ниже коде:

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

Я хочу напечатать его в консоли вот так:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Undistraction
источник

Ответы:

212

Для печати адреса используйте %pспецификатор формата и указатель на себя:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Владимир
источник
6
использование self со спецификатором '% @' действительно вызовет рекурсию, так как это снова вызовет метод -description. Спецификатор% p просто выводит адрес указателя
Владимир
3
Я склонен [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- адрес попадает туда, потому NSObjectчто он имеет, но вы также не выбрасываете ничего, что, по вашему мнению, имеет отношение к отладке в любых суперклассах, от которых вы можете наследовать.
Tommy
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];
}

Таким образом, в случае объектной модели, в которой у вас есть конкретный исполнитель, производный от этого класса, вы покажете правильное имя класса.

Кэмерон Лоуэлл Палмер
источник