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

Und*_*ion 115 objective-c nslog

我正在覆盖对象的描述方法.我需要知道如何打印对象的内存地址来替换下面代码中的{???}:

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

我希望它在控制台中打印如下:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Run Code Online (Sandbox Code Playgroud)

Vla*_*mir 210

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

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

  • 附加说明:`%p`需要一个类型为`void*`的指针,你必须将`self`强制转换为`void*`,否则会发生未定义的行为. (7认同)
  • 使用带有'%@'说明符的self确实会导致递归,因为这会再次调用-description方法.%p说明符只输出指针地址 (6认同)
  • @ user529758:无需强制转换,没有未定义的行为.`void*`和`id`在内部几乎相同,在这种情况下,没有区别你是否将它转换为`void*`. (4认同)
  • 我倾向于`[NSString stringWithFormat:@"%@ parameterOne:...",[super description],...];` - 地址最终在那里,因为`NSObject`有它,但你也没有抛弃你决定与你可能继承的任何超类中的调试相关的任何东西. (3认同)

Cam*_*mer 6

最简单的方法是使用超级描述

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

所以在这个模型对象是NSObject的子类的情况下,你可以躲避额外的工作和记忆%p.

手动使用NSStringWithClass()和%p

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

因此,对于一个对象模型,在该对象模型中,您有一个从该类派生的具体实现者,您将显示正确的类名.