连续'if'陈述

时间:2010-05-03 04:30:59

标签: objective-c cocoa conditional

为TYPO编辑 -

如果第一件事是真的,我如何检查一件事,然后检查另一件事?

例如,假设我有一个购物篮对象,而且我只想在创建篮子并且它不是空的时候做点什么。

我试过了:

if ((basket) && ([basket numberOfItems] >0))...

但即使第一个条件失败,第二个条件也会被评估,从而导致崩溃(可能是因为我在一个不存在的对象上调用numberOfItems)。

我可以嵌套它们,但这看起来有点难看,更重要的是有问题。假设我想做一件事,如果篮子存在并且不是空的,但是如果其中任何一个不是真的那么。这在嵌套的if语句中不能很好地工作。

6 个答案:

答案 0 :(得分:11)

如果Objective-C是C的严格超集(在我的理解中,它是),则布尔评估与&&||运算符短路。这意味着,由于您使用&&,一旦条件失败,其余条件甚至不会被评估。

鉴于您的代码,这意味着如果对象为null,则永远不会调度该消息。

答案 1 :(得分:5)

你的理解不正确;和&& operator 以你想要的方式“短路”。你的问题出在你自己的代码中。

如果崩溃确实在这一行,那么:

  1. 您的basket指针不是nil。如果是,则对numberOfItems的调用将不执行任何操作并返回NO,这是消息nil的默认行为(不会崩溃)。
  2. basket可能曾经是一个对象,已经被这一点解除了分配,现在正在向它发送消息。
  3. basket可能是其他(非零)垃圾指针。在这种情况下或上面的情况下,您可能会在调试器中看到EXC_BAD_ACCESS。
  4. basket可能不支持numberOfItems方法。这通常在调试器中非常明确。
  5. 如果崩溃可能不在这个实际行上,那么其他东西也可能会出现。

    (根据OP更新和有用的评论更新)

答案 2 :(得分:1)

您的代码包含>在方法中,复制粘贴是否失败?如果不是那就是你的问题。

答案 3 :(得分:1)

听起来像basket是一个悬垂的指针。检查以确保正确保留它并将其设置为nil如果您将其释放而不立即将其设置为有效对象。

答案 4 :(得分:0)

扩大其他人所说的内容:&&短路,但&才不是。但是,正如其他人所说,在目标C中,您可以无错误地将方法发送到零,因此短路不是您的问题。 (我刚才提到过& for completeness)。

我认为最可能的问题是你在某个时刻创造了一个篮子,然后释放它,但从未将其设置为零......所以,篮子不是零,但它也不是一个有效的对象...

如果你告诉我们当它崩溃时实际的错误消息是什么可能会有所帮助...我的理论会给出一条错误消息,说明发送消息给已发布或垃圾收集的对象,或类似的东西..

答案 5 :(得分:-1)

if((basket)&&(basket numberOfItems> 0)).....

if(basket!= null)

如果未创建篮子对象或未分配值,则在此条件下....首先它将检查是否有篮子对象分配值....只有当它为真时才会检查另一个条件。 ....如果两者都是真的,那么只有它才能进入那个部分......