在重写的描述方法中使用NSLog输出对象的内存地址

120

我正在重写一个对象的描述方法。我需要知道如何打印该对象的内存地址,以替换下面代码中的{???}

我正在重写一个对象的描述方法。我需要知道如何打印该对象的内存地址,以替换下面代码中的{???}

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

我希望它在控制台中打印出以下内容:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
2个回答

218

使用%p格式说明符和self指针打印地址:

-(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 有它,但你也不会丢弃任何你认为与调试相关的超类信息。 - Tommy
8
附加说明:%p期望一个类型为void *的指针,你需要将self强制转换回void *,否则会发生未定义行为。 - user529758
4
无需进行类型转换,也不会出现未定义的行为。void *id 在内部几乎是相同的,在这种情况下,无论是否将其转换为 void *,没有任何区别。 - Michael
1
你必须在'self'参数之前放置'&'符号。 - Artem Deviatov
显示剩余5条评论

9
最简单的方法是使用超级描述。
- (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];
}

如果您的对象模型中有一个从该类派生的具体实现者,那么您将显示正确的类名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接