2011-12-22 4 views
7

I는 다음과 같은 출력테스트 목표 -C에서 널위한

images in definitionDict (
    "/some/brol/brol.jpg" 
) 
NOTNULL 
images in definitionDict <null> 
NOTNULL 

I는 이미지 어레이는 상기 제 2 케이스를 이해하지 제공 루프

NSArray * images = [definitionDict objectForKey:@"Images"]; 
    NSLog(@"images in definitionDict %@", images); 
    if (!images) 
     NSLog(@"NULL"); 
    else 
     NSLog(@"NOTNULL"); 

다음 코드를 가지고 없는. 내 검사에서 왜 이것이 올바르게 감지되지 않습니까? 어떻게 이러한 문제를 디버깅 할 수 있습니까?

답변

19

<null>nil이 아닙니다. nil은 인쇄 할 때 (null)을 인쇄합니다. 가지고있는 것은 NSNull입니다. NSNull 개체입니다, 그냥 많은 응답하지 않습니다. 사용할 수있는 자리 표시 자로 사용할 수 있습니다.

, 당신은 당신이 목표 - C 객체의 메모리 주소 또는 기타 포인터를 인쇄하려면 NSNull

+0

감사합니다. – madewulf

1

에 대한 추가 정보를 위해 docs를 참조 if ([images isEqual:[NSNull null]])

을 사용할 수 있습니다 NSNull 당신을 테스트하려면 %p이 아닌 %@ 플래그를 사용해야합니다. %@ 플래그는 문자열을 필요로합니다.

그러나 인수가 문자열이 아닌 경우 NSLog은 전달 된 개체에서 자동으로 -description을 호출합니다.0x00000000

NSObject *o = [[NSObject alloc] init]; 
NSLog(@"%p", o); 
[o release]; 

출력 : 뭔가 마음

0x12345678 같은 방법이 NSNull 객체를 반환 때, 그 객체에 -description 문자열을 <null>

NSObject *o = nil; 
NSLog(@"%p", o); 

출력을 반환합니다 :

NSNull *n = [NSNull null]; 
NSLog(@"%p", n); 

출력 : 항상 동일하지만, 배열이 같다 개체들이 있다면 테스트 0x00000000

올바른 방법이 다를 것이다 메모리 어드레스.

NSArray *myArray = [someObject array]; 
if([myArray isEqual:[NSNull null]]) { 
    NSLog(@"No objects"); 
} else { 
    NSLog(@"%d objects.", (int)[myArray length]; 
} 
+1

이 상황에서 하단의 솔루션이 중단됩니다. 이것은 객체가없는 배열이 아닙니다. 그것은 NSNull이고 NSNull은 길이에 응답하지 않습니다. –

+0

@ JoshuaWeinberg 나는 그것을 편집했다. 애플이 'NSNull' 클래스를 만든 이유는 아직도 수수께끼처럼 보입니다. 특히 NSDictionary에서 NSNull 객체를 설정하는 이유는 무엇입니까? 만약 당신이 단지 키를 정의하지 않는다면, 메소드는 여전히'nil'을 리턴 할 것입니다. – v1Axvw

+0

이 경우에는 객체가없는 구와 null 객체를 구별 할 수 있어야합니다. 'nil'은 단지 0입니다. 키가 존재하지 않으면 리턴됩니다. 그래서 여기에서는 JSON을 파싱 한 후 사전에 JSON 'null'이 들어있는 것으로 상상해 봅니다. NSNull이 만들어졌습니다. –