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


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 со спецификатором '% @' действительно вызовет рекурсию, так как это снова вызовет метод -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];
}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.