2010-05-03 71 views
2

编辑TYPO -连续的'if'语句

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

例如,假设我有一个购物篮对象,并且我只想做一些事情,如果篮子已经创建并且它不是空的。

我已经试过:

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

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

我可以将它们嵌套,但这看起来有点难看,而且更重要的是有问题。假如篮子存在并且不是空的,我想要做一件事,但如果两者都不是真的,那么我想做一件事。这在嵌套if语句中并不适用。

+5

呼吁为零的消息是一个空操作。别的东西是你的问题 – cobbal 2010-05-03 04:32:13

+5

而第二个*不*评估如果第一个失败 – 2010-05-03 04:37:39

回答

11

如果Objective-C是C的严格超集(据我了解,它是),然后使用&&||运算符进行布尔运算评估短路。这意味着,由于您使用的是&&,只要条件失败,其余条件甚至不会被评估。

给定您的代码,这意味着如果该对象为null,那么该消息从不分派。

-1

如果((篮法)& &(篮numberOfItems> 0)).....

如果(篮!= NULL)

如果不创建篮对象或没有分配值,那么在这种情况下....首先它会检查是否有篮对象赋值....只有当它是真的,那么只有它会检查另一个条件.....并且如果两者都是真的,则只有它会在那部分......

+0

你不应该比较的对象 - 对象引用'NULL'(还有如'null'中的OBJ-C没有这样的事情/ C BTW)。为了测试Obj-C对象引用是否为“null”(不存在),可以将它与“nil”进行比较。 – 2010-05-03 07:37:12

1

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

+1

应该是一个评论。 – 2010-05-03 09:22:05

5

你的理解不正确; & &运营商“短路”的方式,你想要的。你的问题在你自己的代码中。

如果崩溃确实是在这条线,则:

  1. basket指针不是nil。如果是,则拨打numberOfItems将不会执行任何操作并返回NO,这是邮件nil(未崩溃)的默认行为。
  2. basket可能曾经是一个对象,这已经被这个问题所处理,并且现在正在吹捧它发送一条消息。
  3. basket可能是一些其他(非零)垃圾指针。在这种情况下或上面的情况中,您可能会在调试器中看到EXC_BAD_ACCESS。可能不支持numberOfItems方法。这在调试器中通常非常明确。

如果碰撞可能不在这条线上,那么其他的东西也可能会起作用。

(每OP更新更新&有益的意见)

+0

同意.. [basket numberOfItems> 0]没什么意义。应[篮numberOfItems]> 0 – Ben 2010-05-03 04:55:53

+2

需要明确的是:篮或者是解除分配的对象或垃圾指针。这两者都不等于零。 – Chuck 2010-05-03 06:03:55

1

听起来好像basket是一个悬摆指针。请检查以确保您正确地保留它并将其设置为nil,如果您在释放之后立即将其设置为有效对象,请将其设置为nil

0

扩大其他人说:& &确实短路,但&没有。但是,正如其他人所说的,在目标C中,您可以将方法发送到零,而不会出错,所以短路不是您的问题。 (为了完整性,我刚刚提到了&)。

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

,如果你告诉我们什么实际的错误信息被时坠毁它可能会帮助......我的理论将给予该说,大约将消息发送到一个释放或垃圾回收OBJET一些错误信息,或类似的东西...