我正在编写有关codechool http://tryobjectivec.codeschool.com/的教程,根据本教程,以下代码应该有效:
void (^sumNumbers)(NSUInteger, NSUInteger) = ^(NSUInteger num1, NSUInteger num2){
NSLog(@"The sum of the numbers is %lu", num1 + num2);
};
好吧,我试过让这个工作,尽管xcode已经给了我一些橙色错误信息:
我还是尝试构建代码,只是为了看xcode是否正确或者教程是否正确。好吧,有些事情破灭了:
但更糟糕的是,我无法再次修复xcode,xcode现在假装我编写的所有代码都会导致问题。但我很确定它曾经有效:
答案 0 :(得分:2)
NSUInteger
,至少在32位架构中,typedef
为unsigned int
,而不是long
。 %lu
格式化程序指定要将它们打印为long,因此存在类型冲突。如果您将其打印为%ud
,即unsigned int
。
行sumNumbers(10,20);
的装订线中的蓝色标记表示您在该行上设置了断点,这会导致应用程序中断。删除/禁用该断点,这也可以正常工作。
答案 1 :(得分:1)
为了NSLog
您的NSUInteger
,您应该将您的陈述更改为:
NSLog(@"%ud", num1 + num2);
你的应用程序运行不正常的原因可能是因为你仍然设置了断点。转到Debug > Deactivate Breakpoints
或使用快捷方式⌘Y
,然后尝试运行您的应用程序。
答案 2 :(得分: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映射到%lu所需的大小。您在Web上阅读的所有内容,从Apple文档到Stack Overflow答案都会在某处出错。