Objective-C에서 NULL 대 nil


182

observeValueForKeyPath:ofObject:change:context:- 왜 문서를 사용하지 NULL않고 nil컨텍스트 포인터를 지정하지 않을 경우?


내 생각에, 객체는 nil, 클래스는 Nil, 그리고 NULL은 객체 또는 클래스에 사용
Thanh Vũ Trần

답변:


227

nilidJava 및 C ++ 프로그래머가 객체에 대한 포인터로 생각하는 것 대신에 사용해야 합니다. 사용 NULL되지 않은 객체 포인터에 대해.

해당 메소드의 선언을보십시오.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

컨텍스트는 void *(즉, C 스타일 포인터)이므로 (유형 인 ) 대신 ( NULL때로는로 선언 됨 (void *)0) nil을 사용합니다 id.


2
의 종류하지만 이후 context의가 observeValueForKeyPath:ofObject:change:context:있다 void *,하지 않습니다 그로 전달 된 데이터가 있음을 의미 context객체 포인터가 될 수 있을까? 나는 일반적인 경우라고 생각합니다. 그렇기 때문에 문서가 항상 NULL대신 사용 하는 이유에 대해 혼란 스럽습니다 nil.
erikprice

2
해당 메소드의 컨텍스트 유형은 "void *"입니다. "nil"은 "void *"가 아니지만 NULL입니다.
Paul Tomblin

3
할 수 있습니다. void *는 모든 포인터입니다. 그럼에도 불구하고 NULL이 올바른 상수라는 것은 옳습니다.
Peter Hosey

3
그들은 void *라고 말했다. NULL은 void *이고 nil은 id입니다. 따라서 NULL을 전달합니다. nil을 전달하면 독자에게 거짓말을하는 것입니다.
Peter Hosey

12
또는 다른 방식으로 생각하면 NULL은 더 넓은 유형이고 nil은 NULL의 하위 집합입니다. 일반적으로 얻을 수있는 가장 넓은 유형을 사용하십시오 (예 : Java의 경우 Vector에서 특정 항목이 필요하지 않은 경우 Vector 대신 Collection을 기대하는 메소드 작성)
Paul Tomblin

65

그것들은 기술적으로 같은 (0)이지만 nil은 일반적으로 Objective-C 객체 유형에 사용되며 NULL은 c 스타일 포인터 (void *)에 사용됩니다.


8
또한와 (와 NULL) 다르게 정의되어 nil있습니다. nil로 정의됩니다 (id)0. NULL그렇지 않습니다.

14
@WTP MacTypes.h를 읽으면 #define nil NULL을 선언합니다.
jbat100

1
매우 흥미 롭습니다. 스타일 포인트 이외의 것이 중요하지 않은 것 같습니다. YES / TRUE 및 NO / FALSE와 같습니다.
브레넌

1
@Brennan, nil이 NULL로 정의되었다고해서이면에 숨겨진 숨겨진 구현이 있다는 의미는 아닙니다. 예를 들어, IBAction은 void로 정의되지만 단추 등의 조치에 첨부 ​​할 메소드를 표시 할 때 인터페이스 빌더를 사용할 때 다른 의미를 갖습니다.
Micaiah Wallace

53

그것들은 기술적으로 같은 것이며 스타일 만 다릅니다 :

  • Objective-C 스타일은 유형 (및 객체에 대한 포인터)에 nil사용할 것을 말합니다 id.
  • C 스타일 NULL은 그것이 당신이 사용하는 것이라고 말합니다 void *.
  • C ++ 스타일은 일반적으로 그냥 사용해야한다고 말합니다 0.

나는 일반적으로 형식이 선언 된 언어와 일치하는 변형을 사용합니다 .


14

NULL는 IS C equivalentnil아무것도에 대한 포인터는;

여기서 nil is zero typed as id,

NULL is zero typed as void*.

한 가지 중요한 점 은 NULL로 메시지를 보낼 수 없습니다. 따라서 objective-C에서는 여러 위치에서 nil을 사용하는 것이 좋습니다.


4

그들은 거의 같은 것을 제외하고는

nilObjective-C 스타일로 사용됩니다. NULLC 유형 포인터의 위치 는 다음과 같습니다 (void *).


1
이 기존 답변 의 반복 아닌가?
Pang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.