NSLog以重写的描述方法记录对象的内存地址


116

我覆盖了对象的描述方法。我需要知道如何打印对象的内存地址以替换以下代码中的{???}

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

我希望它在控制台中像这样打印:

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

Answers:


212

要打印地址,请使用%p格式说明符和自指针:

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

6
将self与'%@'说明符一起使用确实会导致递归,因为这将使-description方法再次调用。%p说明符仅输出指针地址
Vladimir

3
我倾向于[NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];-地址最终在那里,因为NSObject有了它,但是您也不会丢弃任何您认为与您可能从其继承的超类中调试有关的东西。
汤米

7
附加说明:%p需要类型为的指针void *,您必须将其强制转换selfvoid *,否则会发生未定义的行为。

4
@ user529758:无需强制转换,没有未定义的行为。void *并且id内部几乎相同,在这种情况下,无论是否将其强制转换都没有区别void *
2014年

1
您必须在'self'参数前加上'&'符号
Artyom Devyatov

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

因此,在对象模型中有一个从此类派生的具体实现者的情况下,将显示正确的类名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.