2014-07-16 27 views
0

我在做一個教程codeschool http://tryobjectivec.codeschool.com/並按照本教程中,下面的代碼應該工作:記錄一個NSUInteger打破的Xcode

void (^sumNumbers)(NSUInteger, NSUInteger) = ^(NSUInteger num1, NSUInteger num2){ 
    NSLog(@"The sum of the numbers is %lu", num1 + num2); 
}; 

好吧,我嘗試了讓這項工作,allthough Xcode中已經給了我一些橙錯誤消息:

image

無論如何我嘗試了構建代碼,只是爲了看看Xcode的是對還是教程是正確的。那麼,什麼地方出現了:

image

但更糟的是,我不能讓Xcode中再次固定,現在的xcode假裝我的一切,我曾經寫過代碼導致的問題。但我敢肯定它用來工作:

image

回答

1

通常建議您不要使用NSInteger,NSUInteger,CGFloat或CFIndex作爲NSLog的直接參數,或者使用printf樣式格式化程序的任何其他操作。原因是它們的大小在32位和64位體系結構之間變化。

在你的情況下,編寫代碼的正確方法是將NSUInteger轉換爲兩個體系結構中的64位無符號長整數,至少就XCode工具鏈而言。需要警告的是,在其他系統上可能不是這種情況 - 例如,C++標準只要求長度至少爲32位。

void (^sumNumbers)(NSUInteger, NSUInteger) = ^(NSUInteger num1, NSUInteger num2){ 
    NSLog(@"The sum of the numbers is %lu", (unsigned long)(num1 + num2)); 
}; 

關於教程,誰寫的可能是工作在64位系統上,所以NSUInteger映射到魯%所需​​要的大小的人。你在網上閱讀的所有東西,從Apple文檔到Stack Overflow的答案都會在某處出現錯誤。

2

NSUInteger是,至少在32位架構,typedef ED作爲unsigned int,而不是long。格式化程序%lu指定您要將它們打印爲長整型,所以存在類型衝突。如果您將它們打印爲%ud,這是一個unsigned int

sumNumbers(10,20);的裝訂線上的藍色標記指示您在該行上設置了斷點,從而導致應用程序中斷。刪除/禁用該斷點,這也可以很好地工作。

+0

感謝您的幫助,但您是否明白爲什麼本教程說我需要'%lu'?他們錯了嗎? – 90intuition

+1

@ 90intuition:在64位體系結構中,'NSUInteger'實際上是一個'unsigned long',其中你的問題的代碼可以正常使用。我猜這在以前的課程中教得太複雜了,所以假設你在使用64位。 –

1

爲了NSLogNSUInteger,你應該改變你的語句是:

NSLog(@"%ud", num1 + num2); 

您的應用程序運行不正常了的原因可能是因爲你仍然有你的斷點設置。請轉至Debug > Deactivate Breakpoints或使用快捷方式⌘Y,然後嘗試運行您的應用程序。