2011-09-22 71 views
1

当我运行这段代码时,控制台的输出是1084848。我无法弄清楚为什么这种奇怪的输出......这里是代码。Xcode给NSArray提供奇怪的输出

#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; 
} 

回答

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]; 

所以,你已经在正确的NSNumber包裹int,但你不能解开它。你需要问你NSNumber的,它拥有像这样的int

[[array objectAtIndex:0] intValue]; 

或者做记录中的一行:

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

字符“%i”被称为“格式化” 。不同类型的值需要不同的格式化器。当您使用Objective-C对象时,您使用“%@”。对于NSIntegerint,您可以使用%i。对于浮动,你会使用“%f”。重点是你需要打开这个数字,或者使用Objective-C格式化程序来处理字符串。

有关您之前获得的奇怪值的简要说明:这是RAM中的内存地址。这是您在使用不正确的格式化程序时最接近的事情。在某些情况下,使用错误的格式化程序将导致EXC_BAD_ACCESS。你是“幸运的”,并且有一个奇怪的价值,而不是一个死亡计划。在继续之前,我建议您学习字符串和格式化程序。它会让你的生活变得更轻松。

3

“%i”格式说明符需要一个整数,而不是对象。

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

Xcode是可能让你在这条线警告:像“转换指定类型‘诠释’,但说法有型‘身份证’。”

+0

等等......但是数组的objectAtIndex 0是一个整数,它是一个基元,而不是一个对象。对? – Monkeyanator

+0

是的,它的工作,但我有点困惑,为什么... – Monkeyanator

+0

@Monkeyanator objectAtIndex:0是一个对象,一个NSNumber。 – ThomasW

0

当您使用%i整数值,那么你应该给参数作为整数如下

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

但是,当你要显示的对象,则必须使用%@标识中,如下所示一般情况下对象:

NSLog(@"%@", array);