Objective-C에서 nil과 NULL을 언제 사용해야합니까?


170

이것은 샘플 코드입니다.

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

nil, NULL 및 [NSNull null]은 언제 사용해야합니까?


4
목표 C 질문과 관련이 있습니다.
Biranchi

nilNULLobjc 인스턴스 의 일종을 의미 합니다. 따라서 특정 값이 objc 인스턴스 또는 일반 포인터 용임을 표시 할 수 있습니다. 유형 관리 및 안전 측면에서 이것은 많은 도움이 될 것입니다.
eonil

4
nilnull/ NULL제로로 정의 된 두 - 동일합니다. 공식적으로 nilObjective-C NULL를 코딩 할 때 와 정기적 인 C / C ++ 문 / 호출을 코딩 할 때 사용하십시오. NSNull그러나 완전히 다른 것입니다. Null / Null 포인터가 허용되지 않는 NSDictionarys와 같이 "아무것도"를 나타내지 않는 자리 표시 자 역할을하는 단일 객체입니다.
핫 릭

좋은 설명을 보려면 링크를 참조하십시오 [여기] [1] [1] : stackoverflow.com/questions/5908936/…
Ameer

답변:


114

당신은 사용할 수 있습니다 nil사용할 수 어디서나 대해 null. 가장 큰 차이점은에 메시지를 보낼 수 nil있으므로 null작동하지 않는 곳에서 사용할 수 있다는 것입니다.

일반적으로을 사용하십시오 nil.


12
기술적으로는 정확히 동일합니다. 메시지를 nil과 NULL로 보낼 수 있습니다. 관용적으로 nil은 일반적으로 물체를 나타내는 데 사용됩니다
cobbal

41
또한 MacTypes.h에는#define nil NULL
cobbal

8
그렇습니다. cobbal이 말했듯이 그들은 동일합니다. NULL은 0x0에 대한 포인터이고, nil은 존재하지 않는 objective-c 객체이고, Nil은 존재하지 않는 objective-c 클래스이지만, 기술적으로는 모두 0입니다. null-null은 Java 또는 C #에 있지만 Objective-C에는 없습니다.
Jason Coco

16
이 대답 [NSNull null]은 매우 다른 짐승 임을 인정하지 못합니다 . NSNull 클래스 참조 에서 인용하자면 , "NSNull 클래스는 컬렉션 객체에서 null 값을 나타내는 데 사용되는 싱글 톤 객체를 정의합니다 (무값을 허용하지 않음)." 숫자 및 값 프로그래밍 주제NSNull 사용 섹션 도 참조하십시오 .
Rob

"주된 차이점은 메시지를 nil로 보낼 수 있다는 것입니다"-메시지도 보낼 수 NULL있습니다.

313

그들은 그들의 유형이 다릅니다. 그들은 모두 0을,하지만 NULLA는 void *, nil입니다 idNil클래스 포인터입니다.


14
가장 최선의 방법으로 설명하기 나는 차이 (들어 있습니다. 감사합니다
야곱

3
이것은 더 많은 투표권이 없기 때문에 제기 된 질문에 대한 가장 좋은 설명이 있기 때문에 허용되는 답변이어야합니다.
James Mertz

5
NULLv에 대한 우아한 설명 nil이지만 이것은 마크 re를 그리워합니다 [NSNull null]. 참조 NSNull의 사용 의 섹션 번호과 가치 프로그래밍 주제NSNull 클래스 참조 .
Rob

둘 다에 대한 포인터 인 것 같습니다 void *. 여기에 다른 대답이 이미 언급되어 있지만을 파헤 치면 objc.h줄을 찾을 수 있습니다 #define nill __DARWIN_NULL.
gkb0986

1
이 답변은 잘 들리지만 다른 답변에 따르면 간단하지 않습니다.
n13

30

nil 은 객체 (Objective-C의 id 유형)와 바인딩 / 대응되는 빈 값입니다. nil 은 참조 / 주소가 없으며 빈 값입니다.

NSString *str = nil;

따라서 객체를 다루는 경우 nil을 사용해야합니다.

if(str==nil)
    NSLog("str is empty");

이제 Objective-C에서 객체아닌 포인터 (C 포인터와 같은)에 NULL 이 사용됩니다 . 마찬가지로 전무 , NULL은 값이나 주소를 얻지 않았다.

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

따라서 상황이있는 경우 구조체 (구조 유형 변수)가 비어 있는지 확인해야 할 때 다음을 사용합니다.

if (dStruct == NULL)
    NSLog("The struct is empty");

또 다른 예를 보자.

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

키값 관측 컨텍스트 C는 포인터 또는 오브젝트 레퍼런스이어야한다. 여기서는 nil을 사용할 수 없습니다 . NULL 을 사용해야 합니다 .

마지막으로 NSNull 클래스는 컬렉션 객체 (NSArray, NSDictionary)에서 null 값을 나타내는 데 사용되는 싱글 톤 객체를 정의합니다. [NSNull 널] 것이다 반환 NSNull의 싱글 인스턴스입니다. 기본적으로 [NSNull null] 은 적절한 개체입니다.

nil 객체를 컬렉션 유형 객체에 삽입하는 방법은 없습니다. 예를 들어 봅시다 :

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

두 번째 줄에는 NSNull 객체를 컬렉션 유형 객체에 삽입하는 것이 완벽하기 때문에 오류가 발생하지 않습니다. 세 번째 줄에는 "object cannot be nil"오류가 발생합니다. nil은 객체가 아니기 때문입니다.


배열에서 nil / null의 실제 사용을 언급 한 +1
Michael

19

NULL과 nil은 서로 같지만 nil은 객체 값이고 NULL은 일반적인 포인터 값 ( (void*)0구체적으로)입니다. [NSNull null]nil이 허용되지 않는 상황에서 nil을 의미하는 객체입니다. 예를 들어 NSArray에는 nil 값을 사용할 수 없습니다. 따라서 "nil"을 나타내려면을 사용할 수 있습니다 [NSNull null].


12

나는 다음을 발견했다.

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

외관상으로는 개념적 차이 외에 차이가 없습니다.



7

둘 다 그냥 타입 캐스트 0입니다. 기능적으로는 차이가 없습니다. 즉

#define NULL ((void*)0)
#define nil ((id)0)

차이점은 있지만 코드를 읽는 사람과 다른 사람에게만 컴파일러는 신경 쓰지 않습니다.

한 가지 더 nil은 객체 값이고 NULL은 일반 포인터 값입니다.


6

최신 OS X 및 iOS SDK에서 :

  • nilNilNULL목표-C와 동일 C ++ 11 전에 오브젝티브 C ++에있다.
  • nilNilstd::nullptrC ++ 11 오브젝티브 C ++ 동일하다.

문체, 많은 사람들이 사용하는 것이 nil목표 - C 오브젝트과 NULL또는 nullptr다른 포인터 유형. 나 자신은 이제 nil모든 곳에서 사용 합니다.

[NSNull null]는 값으로 금지 된 상황에서 (일반적으로 or 와 같은 컬렉션 객체에서) null 값을 나타내는 데 사용 되는 싱글 톤 객체 입니다. 숫자 및 값 프로그래밍 주제 : NSNull 사용nilNSArrayNSDictionary



4

이미 언급했듯이, 그들은 동일하지만 해당 프레임 워크가 작성된 언어에 따라 하나 이상을 사용합니다.

Objective-C와 관련된 모든 것에는 nil을 사용합니다. 예를 들면 다음과 같습니다.

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

그러나 C 프레임 워크 (주소록 프레임 워크 및 CoreFoundation과 같은)에서 데이터 모델의 유효성을 확인할 때 NULL을 사용합니다. 예를 들면 다음과 같습니다.

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

이렇게하면 Obj-C 또는 C 기반 코드를 다루는 경우 코드에 미묘한 단서가 있습니다.


4

nil 은 아무것도 가리키는 객체 포인터입니다. 의미 상 NULL 과는 다르지만 기술적으로는 서로 동일 합니다.

프레임 워크 수준에서 Foundation은 NSNull 을 정의합니다.이 클래스는 단일 NSNull 객체를 반환하는 클래스 메서드 + null을 정의합니다. NSNull 은 0이 아닌 실제 객체 라는 점 에서 nil 또는 NULL 과 다릅니다 .

또한 Foundation / NSObjCRuntime.h에서 Nil 은 아무것도 가리키는 클래스 포인터 로 정의 되지 않습니다.

자세한 정보는 이것을 참조하십시오-nil / Nil / NULL / NSNull


3

상황에 따라 차이가 있습니다.

문자 적으로 Null은 ASCII 0 문자입니다.

Nil은 공란에 해당하며 값은 없습니다.

프로그래밍 컨텍스트에 따라 큰 차이가있을 수 있습니다.


1

예를 들어 (NSError **) 유형의 출력 매개 변수로 Objective-C 메소드를 호출 할 때 NULL을 사용하십시오.

사람들 이이 경우 NULL 대신 nil을 제공하는 웹에서 많은 예제 코드를 볼 수 있습니다. 포인터에 대한 포인터이기 때문에 Objective-C 객체 유형이 아닙니다. 위에서 말했듯이 Objective-C 객체 유형에는 nil을 사용해야합니다.


1

기본적으로 : nil : 객체의 null 포인터 및 null : 다른 유형 포인터 용


0

nil은 값이 없음을 의미하고 NULL은 No Object를 나타냅니다.

NSArray * array = @ [@ "Hello World!", @ 101, [NSNULL null]];

여기서 [NSNULL null]은 객체가 없음을 의미하는 객체이며 동시에 객체가 없음을 나타 내기 위해 nil을 추가 할 수 없습니다.

검사에 nil과 [NSNUll null]을 모두 사용할 수 있습니다.


0

이는 nil, NIL 및 null의 차이점을 이해하는 데 도움이됩니다.

아래 링크는 어떤 식 으로든 도움이 될 수 있습니다.

http://nshipster.com/nil/

nil-> Objective-C 오브젝트의 리터럴 널값.

Objective-C 클래스의 경우 Nil-> 리터럴 널값입니다.

NULL-> C 포인터의 리터럴 널값.

NSNULL-> 싱글 톤 객체는 null을 나타내는 데 사용됩니다.


이것은 새로운 것을 추가합니까 (기존 답변에서 다루지 않는)?
Florian Koch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.