尽管这个问题已经得到解答,但我想我会为未来的读者提供一个更长的答案:
发生了什么?
%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);