尽管这个问题已经得到解答,但我想我会为未来的读者提供一个更长的答案:
发生了什么?
%d
是一个C 格式字符串,用于指示传递的参数之一是整数 ( int
) ivar 值。非常相似%f
用于float
值。
[NSNumber numberWithInteger:index]
返回一个指向 NSNumber 实例的指针。如果你使用%d
,NSLog 认为你传递的是一个整数,而实际上你传递的是一个指针。因此打印了指针值(内存地址)。
是什么%@
?
正如 trojanfoe 所提到的:%@
告诉NSLog()
您正在传递一个对象。在这种情况下,NSLog 要求对象使用字符串来描述自己……它调用该description
方法。
具体答案
对于这个具体的问题,有多种方式。两个主要是:
NSLog(@"number w index %@, %d", [NSNumber numberWithInteger:index], index);
NSLog(@"number w index %d, %d", [[NSNumber numberWithInteger:index] intValue], index);
额外的好处
使用%@
时,传递的对象可以是任何响应 的对象description
,本质上是 NSObject 的任何后代。此外,如果您正在创建自己的类,最好重载description
以返回比默认 NSObject 实现更有意义的字符串。
// Try using it with NSArray or NSDictionary and see how each describe themselves.
NSLog(@"the array description: %@", myArray);
NSLog(@"the dictionary description: %@", myDictionary);