【问题标题】:xcode 5.0.2 boolean values being confusedxcode 5.0.2 布尔值被混淆
【发布时间】:2014-01-12 18:13:09
【问题描述】:

我正在使用 Xcode 5.0.2 并看到一些奇怪的 bool 行为。 当我评估从方法返回的布尔值时,当我将鼠标悬停在它上面时,我认为它是错误的。但是,它进入了 if 语句的真正分支。当我将代码更改为

 if(validWord == false)

再次执行代码,跳转到else分支。 (将值显示为假但解释为真)它似乎正在评估与布尔值相反的值。

当我更改代码以测试 validWord == false

if (validWord == false)

再次执行代码,跳转到else分支。 (评估为真)它似乎正在评估与布尔值相反的值。

有没有人经历过这种行为?

补充: 即使我使用 BOOL,同样的行为也很明显。

我添加了一些NSLOG条目来测试validWord的值;

它返回 1

 NSLog(@"validWord: %i", validWord);

并为

返回 YES
 NSLog(@"result is :%@",((validWord==YES)?@"YES":@"NO"));

当您将鼠标悬停在 Xcode 中的变量 validWord 上时显示 NO 值。 我会尝试 madmik3 的建议。

【问题讨论】:

  • 我的猜测是调试器弹出窗口所说的是错误的,validWord 的值实际上是正确的。如果您在没有调试符号的情况下以发布模式运行代码,则可能会发生这种情况,这会使值默认为 nil。
  • 您在这里混合了来自不同语言的不同习语。 BOOLYESNO 是 Objective-C。 booltruefalse 是 C/C++。此外,您正在与truefalse 进行比较,这通常是个坏主意。如果您切换代码以始终使用 Objective-C 并且不直接与 truefalse 进行比较,是否会出现同样的问题?
  • 三个问题:1) 在最后一张图中,调试器说validWordNO,if 语句的真分支是否运行(即[self unschedule:...] 是否运行?) 2)如果你把这条线放在if(validWord):NSLog(@"validWord: %i", validWord);的正上方,输出是什么? 3)getCurrentWord的方法签名是什么?
  • Johannes,1) 真正的分支运行。 2)它返回一个int值1 3)方法之前返回bool,但为了与第三个屏幕截图一致,将其更改为BOOL,它仍然进入if语句的有效分支。
  • 这是一个常见的问题。能否请您粘贴代码,而不是使用屏幕截图 - 我能想到的唯一可行的解​​释是 if (validWord) 之后的流浪 ; 字符。粘贴代码会揭示这一点。

标签: ios objective-c xcode boolean


【解决方案1】:

您可能没有意识到,但 bool 和 BOOL 之间存在巨大差异。

BOOL 是一个有符号字符。因此,它的值可以从 -128 到 +127。如果将 int 转换为 BOOL,编译器只取最后 8 位。

bool 是 C 语言定义的类型。它只能有值 0 和 1。如果将 int 转换为 bool,如果 int 为零,编译器将生成 0 = false,如果 int 不为零,则编译器生成 1 = true。

检查您从返回 bool 更改为 BOOL 的方法返回什么。

【讨论】:

    【解决方案2】:

    有同样的问题。使用 Xcode 6。当试图从 NSUserDefaults 获取一些值时。重新启动没有帮助。所以我找到了工作。 解决方案 启动模拟器,然后简单地重置内容和设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多