2009-05-13 5 views
11

나는 본 적이 :이것은 무엇입니까 (NSNull *) 컨트롤러 == [NSNull null]해야합니까? 왜 그냥 컨트롤러 == nil 아닌가요? 애플의 예에서

myController *controller = [viewControllers objectAtIndex:page]; 
if ((NSNull *)controller == [NSNull null]) { 
    controller = [[myController alloc] initWithPageNumber:page]; 
    [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    [controller release]; 
} 

나는이 라인에 매우 관심이 : 그 짓을한다면, 난 그냥 전무 점검 것이다

if ((NSNull *)controller == [NSNull null]) { 

. 왜 그들은 그렇게 복잡합니까? 실제로 그게 뭐야? NSNull에 컨트롤러 객체를 캐스팅하는 것처럼 보이고 NSNull에서 null과 같은지 확인하십시오.

A.F.A.I.K. nil은 "no object"를 의미하고 null은 "nothing"을 의미합니다. 여기에 명확한 그림을 얻도록 도와주세요!

답변

12

대부분의 컨테이너에서는 'nil'개체를 삽입 할 수 없습니다. 컨테이너에 null 값을 삽입하려면 NSNull 인스턴스를 사용할 수 있습니다 (NSNull은 싱글 톤임).

특정 예에서 컨트롤러는 배열에서 가져옵니다. 그런 다음 객체가 NSNull 인스턴스가 아닌지 확인하는 것이 좋습니다.

+0

감사합니다. 그래서 (NSNull *) 컨트롤러가 NSNull 컨트롤러를 캐스팅하고 있습니까? 나는 거기에 isKindOfClass 연산자 또는 이와 비슷한 것이 있다고 생각했다. – Thanks

+0

포인터 비교는 isKindOfClass를 호출하는 것보다 (런타임에) 빠르지 만 [controller isEqual : [NSNull null]]처럼 작동해야합니다. 컨트롤러가'id'라고 선언했다면 컴파일러 경고를 피하기 위해 캐스트를 필요로하지 않을 것입니다. –

1

NSArrayNSDictionary과 같은 컬렉션 클래스에는 nil 값을 포함 할 수 없습니다. 귀하의 ivar, viewController, 컬렉션 클래스의 인스턴스입니다. NSNULL은 특별히 nil의 자리 표시 자로 만들어졌으며 컬렉션 클래스에 넣을 수 있습니다.

NSNull 클래스는 (당신이 [NSNull null]을 사용하여 만든) NSNull의 단일 인스턴스가 오직 거기에 있다는 것을 의미 싱글 톤 객체를 정의하지만, 당신이 원하는대로 그것은 많은 장소에서 사용할 수 있습니다.

관련 문제