代码之家  ›  专栏  ›  技术社区  ›  Ben Packard Ross Knipe

连续的“if”语句

  •  2
  • Ben Packard Ross Knipe  · 技术社区  · 16 年前

    为排版而编辑-

    如果第一件事是真的,我怎么能检查一件又一件?

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

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

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

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

    6 回复  |  直到 16 年前
        1
  •  11
  •   Adam Robinson    16 年前

    如果Objective-C是C的严格超集(据我所知,它是),那么布尔求值与 && || 操作员。这意味着既然你在使用 && ,一旦一个条件失败,其余的条件甚至不会被评估。

    给定您的代码,这意味着如果对象为null,则永远不会发送消息。

        2
  •  5
  •   Peter Hosey    16 年前

    1. 你的 basket nil numberOfItems 什么也不做就回来了 NO ,这是消息传递的默认行为
    2. 篮子 可能曾经是一个对象,此时它已经被释放,现在在向它发送消息时爆炸。
    3. 可能是其他(非nil)垃圾指针。在本例或上述情况下,您可能会在调试器中看到EXC\u BAD\u ACCESS。
    4. 篮子 项目数

    如果坠机事件可能不在这条线上,那么其他事情也可能发生。

    (根据OP update&更新);有用的评论)

        3
  •  1
  •   Garrett    16 年前

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

        4
  •  1
  •   Wevah    16 年前

    听起来像 basket 是一个悬空的指针。检查以确保您正确地保留它并将其设置为 nil 如果您在没有立即将其设置为有效对象的情况下释放它。

        5
  •  0
  •   Brian Postow    16 年前

    扩展其他人所说的内容:&是否短路,但&没有。但是,正如其他人所说,在objective C中,可以将方法发送到nil而不会出错,因此短路不是您的问题(我刚才提到&完整性)。

    我认为最可能的问题是,你在某个点上创建了一个篮子,然后释放它,但从来没有把它设置回零。。。所以,篮子不是零,但它也不是一个有效的对象。。。

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

        6
  •  -1
  •   Nitz    16 年前

    如果((篮子)&&(篮子数量项目>0)).....

    如果(篮子!=(空)

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