Ben*_*ard 2 cocoa conditional objective-c
为TYPO编辑 -
如果第一个是真的,我怎么能检查一件事而另一件事呢?
例如,假设我有一个购物篮对象,而且我只想在创建篮子并且它不是空的时候做某事.
我试过了:
if ((basket) && ([basket numberOfItems] >0))...
Run Code Online (Sandbox Code Playgroud)
但即使第一个条件失败也会评估第二个条件,从而导致崩溃(可能是因为我在一个不存在的对象上调用numberOfItems).
我可以嵌套它们,但这看起来有点难看,更重要的是有问题.假设我想做一件事,如果篮子存在并且不是空的,但是如果其中任何一个不是真的那么.这在嵌套的if语句中并不能很好地工作.
Ada*_*son 11
如果Objective-C是C的严格超集(在我的理解中,它是),那么布尔评估与&&和||运算符短路.这意味着,由于您正在使用&&,一旦条件失败,甚至不会评估剩余条件.
给定您的代码,这意味着如果对象为null,则永远不会调度该消息.
你的理解不正确; &&运算符不 "短路",你所希望的方式.您的问题出在您自己的代码中.
如果崩溃真的在这条线上,那么:
basket指针不是nil.如果是,则调用numberOfItems将不执行任何操作并返回NO,这是消息传递的默认行为nil(不会崩溃).basket 可能曾经是一个对象,已经被这一点解除了分配,现在正在向它发送消息. basket可能是其他(非零)垃圾指针.在这种情况下或上面的情况下,您可能会在调试器中看到EXC_BAD_ACCESS.basket可能不支持某种numberOfItems方法.这通常在调试器中非常明确.如果崩溃可能不在这个实际的线上,那么其他东西也可能上升.
(根据OP更新和有用的评论更新)