记录NSUInteger会破坏xcode

时间:2014-07-16 19:19:54

标签: objective-c xcode xcode5

我正在编写有关codechool http://tryobjectivec.codeschool.com/的教程,根据本教程,以下代码应该有效:

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

好吧,我试过让这个工作,尽管xcode已经给了我一些橙色错误信息:

image

我还是尝试构建代码,只是为了看xcode是否正确或者教程是否正确。好吧,有些事情破灭了:

image

但更糟糕的是,我无法再次修复xcode,xcode现在假装我编写的所有代码都会导致问题。但我很确定它曾经有效:

image

3 个答案:

答案 0 :(得分:2)

NSUInteger,至少在32位架构中,typedefunsigned 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答案都会在某处出错。

相关问题