2011-09-22 68 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);