Xcode从NSArray提供奇怪的输出

时间:2011-09-22 02:19:22

标签: iphone objective-c

当我运行此代码时,控制台的输出大约为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;
 }

3 个答案:

答案 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对象时,使用“%@”。对于NSIntegerint,您可以使用%i。对于浮动,您将使用“%f”。关键是您需要打开该数字,或者使用Objective-C格式化字符串。

关于你之前得到的奇怪值的快速说明:这是RAM中的内存地址。当你使用不正确的格式化程序时,它是你最接近的东西。在某些情况下,使用错误的格式化程序将导致EXC_BAD_ACCESS。你是“幸运的”,得到了一个奇怪的价值,而不是一个死的程序。我建议您在继续之前了解字符串和格式化程序。它会让你的生活更轻松。

答案 2 :(得分:0)

当你使用%i作为整数值时,你应该给出如下整数的参数

NSLog(@"%i" , [[array objectAtIndex:0] intValue]);

但是当你想要显示对象时,你必须使用%@来识别一般情况下的对象,如下所示:

NSLog(@"%@", array);