为TYPO编辑 -
如果第一件事是真的,我如何检查一件事,然后检查另一件事?
例如,假设我有一个购物篮对象,而且我只想在创建篮子并且它不是空的时候做点什么。
我试过了:
if ((basket) && ([basket numberOfItems] >0))...
但即使第一个条件失败,第二个条件也会被评估,从而导致崩溃(可能是因为我在一个不存在的对象上调用numberOfItems)。
我可以嵌套它们,但这看起来有点难看,更重要的是有问题。假设我想做一件事,如果篮子存在并且不是空的,但是如果其中任何一个不是真的那么。这在嵌套的if语句中不能很好地工作。
答案 0 :(得分:11)
如果Objective-C是C的严格超集(在我的理解中,它是),则布尔评估与&&
和||
运算符短路。这意味着,由于您使用&&
,一旦条件失败,其余条件甚至不会被评估。
鉴于您的代码,这意味着如果对象为null,则永远不会调度该消息。
答案 1 :(得分:5)
你的理解不正确;和&& operator 以你想要的方式“短路”。你的问题出在你自己的代码中。
如果崩溃确实在这一行,那么:
basket
指针不是nil
。如果是,则对numberOfItems
的调用将不执行任何操作并返回NO
,这是消息nil
的默认行为(不会崩溃)。basket
可能曾经是一个对象,已经被这一点解除了分配,现在正在向它发送消息。 basket
可能是其他(非零)垃圾指针。在这种情况下或上面的情况下,您可能会在调试器中看到EXC_BAD_ACCESS。basket
可能不支持numberOfItems
方法。这通常在调试器中非常明确。如果崩溃可能不在这个实际行上,那么其他东西也可能会出现。
(根据OP更新和有用的评论更新)
答案 2 :(得分:1)
您的代码包含>在方法中,复制粘贴是否失败?如果不是那就是你的问题。
答案 3 :(得分:1)
听起来像basket
是一个悬垂的指针。检查以确保正确保留它并将其设置为nil
如果您将其释放而不立即将其设置为有效对象。
答案 4 :(得分:0)
扩大其他人所说的内容:&&短路,但&才不是。但是,正如其他人所说,在目标C中,您可以无错误地将方法发送到零,因此短路不是您的问题。 (我刚才提到过& for completeness)。
我认为最可能的问题是你在某个时刻创造了一个篮子,然后释放它,但从未将其设置为零......所以,篮子不是零,但它也不是一个有效的对象...
如果你告诉我们当它崩溃时实际的错误消息是什么可能会有所帮助...我的理论会给出一条错误消息,说明发送消息给已发布或垃圾收集的对象,或类似的东西..
答案 5 :(得分:-1)
if((basket)&&(basket numberOfItems> 0)).....
或
if(basket!= null)
如果未创建篮子对象或未分配值,则在此条件下....首先它将检查是否有篮子对象分配值....只有当它为真时才会检查另一个条件。 ....如果两者都是真的,那么只有它才能进入那个部分......