5

我对 NSLog 的语法有点困惑。例如,

    NSString *nameString = @"名称";
    NSLog(@"nameString is: %@", nameString);
    
如果我的理解是正确的(很可能不是),那么 nameString 被定义为指向字符串的指针。我当时认为这将打印 nameString 保存的内存地址,而不是该地址的值。因此,如果这是真的,那么在 NSLog 语句中,要获取指针的值,我们是否需要使用星号符号来访问 nameString 指向的内容,如下所示:
    NSLog(@"nameString 是:%@", *nameString);
    
? 自从用 C 编程以来已经有一段时间了,但由于 Objective-C 是 CI 的超集,因此认为它们的行为会相似。

一个解释将不胜感激!谢谢!

4

3 回答 3

16

命令 %@ 就像调用-description接收器上的方法的“快捷方式”。对于 NSString 它只是显示字符串本身,因为它是从 NSObject 继承的,您可以覆盖它,如果您为自己的类创建非常有用。在这种情况下,默认行为是打印指针的值。
如果要打印字符串中指针的地址,只需替换为:

NSLog(@"nameString is: %p", nameString)
于 2013-04-14T09:01:06.977 回答
0

我认为您仅使用星号来声明指针。然后,您只使用您决定的名称。例如:

NSString *foo = [[NSString alloc] initWithString:@"Hello"];

NSLog(@"%@", foo);

如果我错了,请纠正我:)

于 2013-04-14T09:01:25.713 回答
0

它是一个对象,而 NSLog 是一个函数,它使用其格式说明符来确定如何处理参数。在这种情况下,说明符是 %@,它告诉 NSLog 调用对象上的方法。通常这将调用返回 NSString 的方法“description”,但它可能首先会先响应到方法,然后再使用其他一些字符串方法。

于 2013-04-14T09:04:06.403 回答