当我运行此代码时,控制台的输出大约为1084848。我无法弄清楚为什么这么奇怪的输出......这里是代码。
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *array = [[NSMutableArray alloc] init];
int someNumber = 3;
[array addObject:[NSNumber numberWithInt:someNumber]];
NSLog(@"%i" , [array objectAtIndex:0]);
[pool drain];
return 0;
}
答案 0 :(得分:3)
“%i”格式说明符需要一个整数,而不是一个Object。
尝试NSLog(@"%i" , [[array objectAtIndex:0] intValue]);
XCode可能会在这一行给你一个警告:类似“转换指定类型'int',但参数的类型为'id'”。
答案 1 :(得分:2)
这是你的程序的伪代码:
//
// Inside of your main function....
//
// Set up the Autorelease pool and then create an array
//
// Declare an int
//
// Add the int to an array, while wrapping it in an NSNumber
//
// Log the value of the first object in the array, using the int formatter
//
// Clean up and return
//
您正在记录数组中的第一个对象,但NSArray
无法保存未包含在Objective-C对象中的原语。
为了更好地理解您的代码,请尝试更改以下代码行:
int someNumber = 3;
[array addObject:[NSNumber numberWithInt:someNumber]];
稍微展开一下。试试这个:
int someNumber = 3;
NSNumber *aNumber = [NSNumber numberWithInt:someNumber];
[array addObject:aNumber];
因此,您已将int
正确包裹在NSNumber
中,但您并未将其展开。您需要向NSNumber
询问int
它所持有的内容:
[[array objectAtIndex:0] intValue];
或者,在一行中进行日志记录:
NSLog(@"%i" , [[array objectAtIndex:0] intValue]);
字符“%i
”称为“格式化程序”。不同类型的值需要不同的格式化程序。使用Objective-C对象时,使用“%@
”。对于NSInteger
或int
,您可以使用%i
。对于浮动,您将使用“%f
”。关键是您需要打开该数字,或者使用Objective-C格式化字符串。
关于你之前得到的奇怪值的快速说明:这是RAM中的内存地址。当你使用不正确的格式化程序时,它是你最接近的东西。在某些情况下,使用错误的格式化程序将导致EXC_BAD_ACCESS。你是“幸运的”,得到了一个奇怪的价值,而不是一个死的程序。我建议您在继续之前了解字符串和格式化程序。它会让你的生活更轻松。
答案 2 :(得分:0)
当你使用%i
作为整数值时,你应该给出如下整数的参数
NSLog(@"%i" , [[array objectAtIndex:0] intValue]);
但是当你想要显示对象时,你必须使用%@
来识别一般情况下的对象,如下所示:
NSLog(@"%@", array);