Последовательные заявления «если» - PullRequest
2 голосов
/ 03 мая 2010

EDITED FOR TYPO -

Как проверить одну вещь, а затем другую, если первая верна?

Например, скажем, у меня есть объект корзины покупок, и я хочу толькочто-то сделать, если корзина была создана И она не пуста.

Я пробовал:

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

Но второе условие оценивается, даже если первое не выполняется, в результате чегосбой (предположительно потому, что я вызываю numberOfItems для объекта, который не существует).

Я могу их вложить, но это кажется немного уродливым, а в некотором смысле проблематичным.Скажем, я хочу сделать одну вещь, если корзина существует и не пуста, но другую, если одна из них не соответствует действительности.Это не очень хорошо работает во вложенных операторах if.

Ответы [ 6 ]

11 голосов
/ 03 мая 2010

Если Objective-C является строгим надмножеством C (что, на мой взгляд, так и есть), то в булевых вычислениях возникают короткие замыкания с операторами && и ||. Это означает, что, поскольку вы используете &&, как только условие не выполняется, остальные условия даже не оцениваются.

Учитывая ваш код, это означает, что если объект нулевой, то сообщение никогда не отправляется.

5 голосов
/ 03 мая 2010

Ваше понимание неверно; оператор && делает «короткое замыкание» так, как вам нужно. Ваша проблема где-то в вашем собственном коде.

Если сбой действительно в этой строке, то:

  1. Ваш указатель basket не nil. Если бы это было так, вызов numberOfItems ничего бы не сделал и вернул бы NO, что является поведением по умолчанию для обмена сообщениями nil (не сбой).
  2. basket, возможно, когда-то был объектом, к этому моменту он уже был освобожден и сейчас взрывается при отправке ему сообщения.
  3. basket может быть другим (не нулевым) указателем мусора. В этом случае или выше, вы, вероятно, увидите EXC_BAD_ACCESS в отладчике.
  4. basket может не поддерживать метод numberOfItems. Обычно это делается довольно явно в отладчике.

Если сбой, возможно, не в этой реальной строке, то может быть что-то еще.

(обновляется за обновление OP и полезные комментарии)

1 голос
/ 03 мая 2010

Звучит для меня, как basket - свисающий указатель. Убедитесь, что вы правильно сохраняете его и устанавливаете его на nil, если вы отпускаете его, не устанавливая его сразу же после действительного объекта.

1 голос
/ 03 мая 2010

В вашем коде есть> в методе, была ли ошибка при копировании? Если нет, то это ваша проблема.

0 голосов
/ 03 мая 2010

, чтобы рассказать о том, что говорили другие: && делает короткое замыкание, но & не делает. Однако, как уже говорили другие, в задаче C вы можете отправлять методы на ноль без ошибок, поэтому короткое замыкание не является вашей проблемой. (Я только что упомянул & для полноты).

Я думаю, что наиболее вероятной проблемой является то, что вы в какой-то момент создаете корзину, а затем выпускаете ее, но никогда не устанавливаете ее обратно в ноль ... так что корзина не равна нулю, но это также не допустимый объект ...

это могло бы помочь, если бы вы сказали нам, каково было фактическое сообщение об ошибке, когда оно аварийно завершилось ... Моя теория выдала бы сообщение об ошибке, в котором говорится что-то об отправке сообщения в освобожденный объект или объект сбора мусора, или что-то в этом роде ... .

0 голосов
/ 03 мая 2010

if ((корзина) && (номер корзиныOfItems> 0)) .....

или

if (basket! = Null)

если объект корзины не создан или ему не присвоено значение, то в этом условии .... сначала он проверяет, есть ли назначенное значение объекта корзины ... только если оно истинно, только тогда он будет проверять другое условие. .... и если оба истинны, то только если это будет частью .....

...