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




objectivec nil (11)

@cobbal의 의견을 확대하려면 다음을 수행하십시오.

MacTypes.h 는 다음을 포함합니다 :

#ifndef nil
   #define nil NULL
#endif

다음은 샘플 코드입니다.

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


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


nil은 값 없음을 의미하고 NULL은 객체 없음을 나타내며,

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

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

확인을 위해 [NSNUll null]과 nil을 모두 사용할 수 있습니다.


그들은 둘 다 단지 형 변환 0입니다. 기능적으로는 차이가 없습니다. 즉,

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

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

한 가지 더 nil은 객체 값이고 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 */

외형은 차이가 없지만 개념적 차이는 없습니다.


유형이 다릅니다. 그들은 모두 0이지만 NULLvoid * 이고 nilid 이며 Nil 은 클래스 포인터입니다.


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

Objective-C와 관련된 모든 것에 대해 nil을 사용합니다. 예 :

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

    // process elements
    ...
}

그러나 AddressBook 프레임 워크 및 CoreFoundation과 같은 C 프레임 워크에서 데이터 모델의 유효성을 확인할 때 NULL을 사용합니다. 예 :

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

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

이렇게하면 Obj-C 또는 C 기반 코드를 처리 할 때 코드에 미묘한 단서가 생깁니다.


일부 컨텍스트에는 차이가 있습니다.

문자 그대로 Null은 ASCII 0 문자입니다.

Nil은 공백 값과 동일합니다.

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


if([NSNull null])true 리턴 if([NSNull null]) 주의하십시오.


null 을 사용할 수있는 곳이면 어디에서도 nil 을 사용할 수 있습니다. 가장 큰 차이점은 메시지를 nil 보낼 수 있기 때문에 null can not work가있는 곳에서도 사용할 수 있다는 것입니다.

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


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

프레임 워크 레벨에서 Foundation은 NSNull 을 정의합니다.이 메서드는 싱글 톤 NSNull 객체를 반환하는 + null 메서드를 정의합니다. NSNull0 또는 NULL 이 아닌 실제 객체 라는 점에서 nil 또는 NULL 과 다릅니다.

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

http://nshipster.com/nil/





nsnull