【问题标题】:NSLog an object's memory address in overridden description methodNSLog 覆盖描述方法中对象的内存地址
【发布时间】:2011-09-26 12:36:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c nslog


    【解决方案1】:

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

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

    【讨论】:

    • 将 self 与 '%@' 说明符一起使用确实会导致递归,因为这会使 -description 方法再次调用。 %p 说明符只输出指针地址
    • 我倾向于[NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];——地址最终在那里,因为NSObject 有它,但你也不要丢弃任何你决定与在任何超类中调试相关的东西继承自。
    • 附加说明:%p 需要 void * 类型的指针,您必须将 self 转换回 void *,否则会发生未定义的行为。
    • @user529758:不需要强制转换,没有未定义的行为。 void *id 在内部几乎相同,在这种情况下,无论您是否将其转换为 void * 都没有区别。
    • 你必须在 'self' 参数前加上 '&' 符号
    【解决方案2】:

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

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

    因此,对于您拥有派生自此类的具体实现者的对象模型,您将显示正确的类名。

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多