2010-05-03 2 views
2

EDITED FOR TYPO -Последовательные заявления «если»

Как я могу проверить одну вещь И ТОГДА другое, если первое верно?

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

Я пробовал:

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

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

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

+5

вызов сообщения на nil - это не-op. что-то еще ваша проблема – cobbal

+5

И второй * не * оценивается, если первый сбой –

ответ

11

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

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

-1

если ((корзина) & & (корзина numberOfItems> 0)) .....

или

если (корзинка! = NULL)

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

+0

Вам не следует сравнивать ссылку объекта объекта Obj-C на «NULL» (в Obj-C/C BTW). Чтобы проверить, является ли ссылка объекта Obj-C «нулевой» (несуществующей), вы сравниваете ее с «nil». –

1

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

+1

Должен быть комментарий. –

5

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

Если авария происходит на самом деле на этой линии, то:

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

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

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

+0

согласен .. [корзина номерOfItems> 0] мало смысла. должно быть [basket numberOfItems]> 0 – Ben

+2

Чтобы быть ясным: корзина является либо деалоцированным объектом, либо указателем мусора. Ни один из них не равен нулю. – Chuck

1

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

0

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

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

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

Смежные вопросы