2010-05-03 2 views
2

TYPO 용으로 편집 됨 -연속적인 'if'문

첫 번째 사실이 무엇인지 어떻게 확인하나요?

예를 들어 쇼핑 바구니 개체가 있고 바구니가 만들어져 있고 비어 있지 않은 경우에만 작업을 수행하려고한다고 가정합니다.

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

그러나 두 번째 조건은 첫 번째는 (내가 존재하지 않는 개체에 numberOfItems를 호출하고있어 아마도 때문에) 충돌의 결과로 실패하는 경우에도 평가 :

은 내가 시도했습니다.

나는 그들을 중첩시킬 수 있지만 이것은 약간 추한 것처럼 보입니다. 더 중요한 것은 문제가되는 것입니다. 바구니가 존재하고 비어 있지 않다면 한 가지 일을하고 싶다고 말하면됩니다. 중첩 된 if 문에서는 그다지 잘 작동하지 않습니다.

+5

nil에 메시지를 부르는 것은 아무런 일이 아닙니다. 뭔가 다른 문제가 있습니다 – cobbal

+5

그리고 첫 번째 실패한 경우 두 번째 *는 평가되지 않습니다 –

답변

11

Objective-C가 C의 엄격한 상위 집합 인 경우 (내 이해할 수 있음), &&|| 연산자를 사용하여 불리언 평가 단락이 발생합니다. 즉, &&을 사용 중이므로 조건이 실패하면 나머지 조건도 평가되지 않습니다.

코드가 주어지면 개체가 null이면 메시지가 전달되지 않음을 의미합니다.

-1

((바스켓) & & (바스켓 numberOfItems는> 0)) .....

또는

(바구니! = NULL)

바스켓 오브젝트가 작성되어 있지 않으면 만약 있다면 또는 할당되지 않은 값을이 조건에서 .... 우선 바구니 객체 할당 값이 있는지 확인합니다 .... 오직 참인 경우에만 다른 조건을 검사합니다 ..... 그리고 둘 다 참이면 단지 그 부분에 있다면 ..... .....

+0

Obj-C 객체 참조를 'NULL'과 비교하면 안됩니다 (Obj-C/C BTW). Obj-C 객체 참조가 "null"(존재하지 않음)인지 테스트하려면이 객체를'nil'과 비교하십시오. –

1

코드에> 메서드 내에서> 복사 붙여 넣기가 실패 했습니까? 그렇지 않다면 당신 문제입니다.

+1

댓글이어야합니다. –

5

이해가 올바르지 않습니다. & & 연산자 "단락 회로"를 원하는 방식으로 수행합니다. 문제는 자신의 코드 어딘가에 있습니다.

충돌 후,이 라인에 정말 경우

:

  1. 귀하의 basket 포인터가 nil 없습니다. 이 경우 numberOfItems을 호출하면 아무 작업도 수행되지 않고 nil (충돌하지 않음)의 기본 동작 인 NO을 반환합니다.
  2. basket은 이미 한 번 개체가되었을 수도 있습니다.이 시점까지는 이미 할당 취소되었으므로 이제 메시지를 보내면서 불고 있습니다.
  3. basket은 (다른 것이 아닌) 쓰레기 포인터 일 수 있습니다. 이 경우 또는 위의 경우에는 디버거에서 EXC_BAD_ACCESS가 표시됩니다.
  4. basketnumberOfItems 메서드를 지원하지 않을 수 있습니다. 이것은 일반적으로 디버거에서 아주 명백하게 만들어졌습니다.

크래시가이 실제 행에 없을 가능성이있는 경우 다른 항목도있을 수 있습니다.

은 (& 도움이 의견 OP 업데이트마다 업데이트)

+0

동의 [basket numberOfItems> 0]은 거의 의미가 없습니다. [basket numberOfItems]> 0 – Ben

+2

이어야 함 clear : 바구니는 할당 해제 된 객체이거나 가비지 포인터입니다. 이들 중 어느 것도 nil과 동등하지 않습니다. – Chuck

1

basket처럼 나에게 소리 매달려 포인터입니다. 올바른 오브젝트에 즉시 설정하지 않고 해제하면 올바르게 유지하고 있는지 확인하고 nil으로 설정하십시오.

0

다른 사람들의 의견을 확장하십시오 : & &은 단락 하나, & 않습니다. 그러나 다른 사람들이 말했듯이 객관적인 C 언어에서는 오류없이 아무 것도 쓸 수 없으므로 단락이 문제가되지 않습니다. (완전성을 위해 방금 &을 언급했습니다.)

나는 가장 가능성있는 문제는 어떤 점에서 바구니를 만들고 나서 풀어 주지만 결코 다시 설정하지 않는다는 것입니다 ... 그래서 바구니는 무효가 아니지만 유효하지 않습니다. 객체 ...

실제 오류 메시지가 추락했을 때 어떤 내용인지 알려 주시면 도움이 될 수 있습니다. 제 이론은 공개 된 메시지 또는 가비지 수집 된 objet에 메시지를 보내는 것과 관련된 오류 메시지를 표시하거나 그런 것 ...

관련 문제