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을,하지만 NULL
A는 void *
, nil
입니다 id
및 Nil
클래스 포인터입니다.
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
.
@cobbal의 주석을 확장하려면 :
MacTypes.h 는 다음을 포함합니다 :
#ifndef nil
#define nil NULL
#endif
둘 다 그냥 타입 캐스트 0입니다. 기능적으로는 차이가 없습니다. 즉
#define NULL ((void*)0)
#define nil ((id)0)
차이점은 있지만 코드를 읽는 사람과 다른 사람에게만 컴파일러는 신경 쓰지 않습니다.
One more thing nil is an object value while NULL is a generic pointer value.
In modern OS X and iOS SDKs:
nil
andNil
andNULL
are identical in Objective-C and in Objective-C++ before C++11.nil
andNil
andstd::nullptr
are identical in Objective-C++ with C++11.
Stylistically, many people prefer to use nil
for Objective-C objects and NULL
or nullptr
for other pointer types. I myself now use nil
everywhere.
[NSNull null]
is a singleton object use to represent null values in situations where nil
is prohibited as a value (typically in a collection object such as an NSArray
or NSDictionary
). Number and Value Programming Topics: Using NSNull
As already mentioned, they are the same, but I use either the one or the other depending on the language in which the corresponding framework was written.
For everything related to Objective-C, I use nil. For example:
- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
if (anArray == nil) return NO;
// process elements
...
}
However, when checking validity of data models from a C-framework (like AddressBook framework and CoreFoundation), I use NULL. For example:
- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
if (aRecord == NULL) return NO;
// set-up the ABUnknownPersonViewController and display it on screen
..
}
This way, I have subtle clues in my code if I'm dealing with Obj-C or C based code.
There is a difference in some contexts.
Literally, Null is a character: ASCII 0.
Nil is equivalent to blank, no value.
Depending on the programming context, this can be a big difference.
nil is an object pointer to nothing. Although semantically distinct from NULL, they are technically equivalent to one another.
On the framework level, Foundation defines NSNull, which defines a class method, +null, which returns the singleton NSNull object. NSNull is different from nil or NULL, in that it is an actual object, rather than a zero value.
Additionally, in Foundation/NSObjCRuntime.h, Nil is defined as a class pointer to nothing.
Refer this for further info - nil / Nil / NULL / NSNull
Use NULL for example when you invoke an Objective-C method with an output parameter of type (NSError **).
I see lots of example code on the web where people provide nil instead of NULL in this case. This is because it's a pointer to a pointer and thus not directly an Objective-C object type. As said above, nil should be used for Objective-C object types.
nil means absence of value while NULL represent No Object,
NSArray *array = @[@"Hello World !", @101,[NSNULL null] ];
Here [NSNULL null] is an object which means no object, at the same time you cannot add nil to indicate absence of object.
you can use both nil and [NSNUll null] for checking too.
This will help you to understand the difference between nil, NIL and null.
The below link may help you in some way:
nil -> literal null value for Objective-C objects.
Nil -> literal null value for Objective-C classes.
NULL -> literal null value for C pointers.
NSNULL -> singleton object used to represent null.
Basically: nil: null pointer on an object and null: is for other type pointer
참고URL : https://stackoverflow.com/questions/1564410/when-should-i-use-nil-and-null-in-objective-c
'Programing' 카테고리의 다른 글
Android Studio의 IML 파일이란 무엇입니까? (0) | 2020.06.01 |
---|---|
액세스 제한 : 'Application'유형이 API가 아님 (필수 라이브러리 rt.jar에 대한 제한) (0) | 2020.05.31 |
macOS에서 my.cnf 파일의 위치 (0) | 2020.05.31 |
밀리 초를“hh : mm : ss”형식으로 변환하는 방법은 무엇입니까? (0) | 2020.05.31 |
adb가 내 장치 / 전화를 찾지 못했습니다 (MacOS X) (0) | 2020.05.31 |