2012-11-01 3 views
1
NSNumber *x = [NSNumber numberWithBool:NO]; 
NSNumber *y = [NSNumber numberWithUnsignedInt:0]; 
assert([x isEqual:y]); 
assert(x==y); 

첫 번째 어설 션이 통과되고 두 번째 어설 션이 실패합니다. 이유가 무엇입니까? 그들의 'objCType'이 다르기 때문에? isEqual :와 == 연산자의 정의 사이의 차이점은 무엇입니까?NSNumber : NO == 0?

왜 내가이 작업을 수행해야합니까? API가 BOOL 대신 NSNumber를 필요로하는 일부 백엔드에 부울 값을 저장해야하므로 BOOL을 저장하기 전에 모든 BOOL을 NSNumber로 변환해야합니다. 그 반대도 마찬가지입니다.

+2

'x'와'y'가'[NSNumber numberWithBool : NO]'이면 더 분명 해졌을 것입니다.'==' –

답변

5

== 연산자

== 운영자들이 똑같은 있는지 기본적으로 입력 된 값뿐만 아니라, 오브젝트 포인터를 비교한다. 이는 네이티브 형식의 두 값이 같은지 확인하려는 경우에 유용합니다 (1 == 1, 여기서 1은 int 임). 또한 두 개의 포인터가 동일한 객체를 가리키는 지 확인할 수 있습니다. x 이후

NSNumber *x = [NSNumber numberWithBool:NO]; 
NSNumber *y = x; 

다음 x==y이 참

y와 같은 객체를 가리키는 예를 들어, 경우이 있었다.

isEqual: 방법

isEqual: 방법은 단순히이 같은 경우 두 NSObjects보고 비교, 그러나 반드시 동일한 객체. 은 "은 y과 같습니까?"라고 묻는 반면 x==y은 묻습니다. "xy과 같은 개체를 가리 킵니까?"

(당신이 *를 사용할 때 포인터를 선언하는, 기억하십시오.)

결론

당신은 기본적으로 입력 값이나 포인터를 사용하지 않기 때문에, 당신은 isEqual:를 사용해야합니다. isEqual: 메서드는 개체 자체가 아닌 두 개체의 값을 비교합니다.

또한 [NSNumber numberWithBool:NO][NSNumber numberWithUnsignedInt:0]은 실제로 동일한 값을 산출하므로 isEqual:이 true를 반환합니다.

+0

에서 여전히 실패 할 것입니다. [x isEqual : y] [x objCType]이 'c'이고 [y objCType]이 'i'인 경우에도 true입니다. –