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

이것은 샘플 코드입니다.

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]은 언제 사용해야합니까?



답변

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

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


답변

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


답변

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은 객체가 아니기 때문입니다.


답변

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


답변

나는 다음을 발견했다.

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 */

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


답변

if([NSNull null])반환 하는 것을 조심하십시오 true.


답변

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

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

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

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