목표-C에서 언제 0과 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]을(를) 언제 사용해야 합니까?
그들은 그들의 유형이 다릅니다.이지만, 입니다.NULL
입니다.void *
,nil
입니다.id
,그리고.Nil
클래스 포인터입니다.
사용할 수 있습니다.nil
할 수 있는 곳에 할수있모곳에서든는사용▁about▁anywhere서곳▁you에.null
큰 은 주요차은메보수것있입다니다는낼시를지이점▁to로 를 보낼 수 있다는 것입니다.nil
그래서 당신은 그것을 몇몇 장소에서 사용할 수 있습니다.null
일을 할 수 없습니다.
일반적으로, 그냥 사용하세요.nil
.
nil은 개체에 바인딩되거나 해당하는 빈 값입니다(Objective-C의 id 유형).nil은 참조/주소가 없고 빈 값만 있습니다.
NSString *str = nil;
우리가 어떤 물체를 다룰 때는 0을 사용해야 합니다.
if(str==nil)
NSLog("str is empty");
이제 NULL은 Object-C에서 C 포인터와 같은 비오브젝트 포인터에 사용됩니다.nil과 마찬가지로 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 포인터 또는 개체 참조여야 합니다.여기서는 문맥상 0을 사용할 수 없습니다. NULL을 사용해야 합니다.
마지막으로 NSNull 클래스는 컬렉션 개체(NSarray, NSDictionary)에서 null 값을 나타내는 데 사용되는 싱글톤 개체를 정의합니다.[NSNull null]은 NSNull의 싱글톤 인스턴스를 반환합니다.기본적으로 [NSNull null]은(는) 올바른 개체입니다.
컬렉션 유형 개체에 0 개체를 삽입할 수 없습니다.예를 들어 보겠습니다.
NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];
두 번째 줄에서는 NSNull 개체를 수집 유형 개체에 삽입하는 것이 완벽하게 공정하기 때문에 오류가 발생하지 않습니다.세 번째 줄에서 "object cannot be nill" 오류가 발생합니다.0은 물체가 아니기 때문입니다.
값입니다(NULL 은 nil 은일객 nil 은이값체고 NULL 반터값입니다인포일만동하지과은은▁null▁nil값▁value입다니▁is▁object▁value▁are).(void*)0
구체적으로). [NSNull null]
0이 허용되지 않는 상황에서 0을 의미하는 객체입니다.예를 들어 NSA ray에는 0 값을 가질 수 없습니다.을 "nil"을 사용하면 .[NSNull null]
.
다음을 찾았습니다.
목적어
#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
Mac 유형.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은 일반 포인터 값입니다.
최신 OS X 및 iOS SDK의 경우:
nil
그리고.Nil
그리고.NULL
C++11 이전의 목표-C와 목표-C++에서는 동일합니다.nil
그리고.Nil
그리고.std::nullptr
목표-C++와 C++11은 동일합니다.
스타일적으로, 많은 사람들이 사용하는 것을 선호합니다.nil
및 Objective-C 객체의 NULL
또는nullptr
다른 포인터 유형의 경우.나 자신이 지금 사용합니다.nil
온통.
[NSNull null]
는 다음과 같은 상황에서 null 값을 나타내는 싱글톤 객체 사용입니다.nil
값으로 금지됩니다(일반적으로 다음과 같은 수집 개체에서).NSArray
또는NSDictionary
) 숫자 및 값 프로그래밍 항목: NSNull 사용
@cobbal에서 주석을 확장하려면:
MacTypes.h에는 다음이 포함됩니다.
#ifndef nil
#define nil NULL
#endif
이미 언급한 것처럼 동일하지만, 저는 해당 프레임워크가 작성된 언어에 따라 하나 또는 다른 하나를 사용합니다.
Objective-C와 관련된 모든 것에 대해 저는 0을 사용합니다.예:
- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
if (anArray == nil) return NO;
// process elements
...
}
그러나 C-framework(주소록 프레임워크, CoreFoundation 등)에서 데이터 모델의 유효성을 확인할 때는 NULL을 사용합니다.예:
- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
if (aRecord == NULL) return NO;
// set-up the ABUnknownPersonViewController and display it on screen
..
}
이런 식으로, 제가 Obj-C 또는 C 기반 코드를 다루는 경우 제 코드에 미묘한 단서가 있습니다.
nil은 none에 대한 개체 포인터입니다.의미론적으로는 NULL과 구별되지만 기술적으로는 NULL과 동일합니다.
프레임워크 수준에서 Foundation은 NSNull을 정의합니다. NSNull 개체를 반환하는 클래스 메서드 +null을 정의합니다.NSNull은 0 값이 아닌 실제 개체라는 점에서 nil 또는 NULL과 다릅니다.
또한 Foundation/NSObjCRuntime.h에서 Nil은 none에 대한 클래스 포인터로 정의됩니다.
자세한 내용은 이 항목을 참조하십시오. - 0 / 0 / NULL / NSNull
어떤 상황에서는 차이가 있습니다.
문자 그대로 Null은 ASCII 0 문자입니다.
Nil은 공백, 값 없음과 같습니다.
프로그래밍 상황에 따라 큰 차이가 있을 수 있습니다.
예를 들어 출력 매개 변수가 유형(NSError **)인 Objective-C 메서드를 호출하는 경우 NULL을 사용합니다.
저는 웹에서 사람들이 이 경우 NULL 대신 0을 제공하는 예제 코드를 많이 봅니다.이것은 포인터에 대한 포인터이기 때문에 Objective-C 개체 유형이 직접적으로 아니기 때문입니다.위에서 언급한 것처럼 Objective-C 객체 유형에는 0을 사용해야 합니다.
기본적으로 nil: 객체의 null 포인터이고 null:은 다른 형식 포인터에 대한 것입니다.
nil은 값이 없음을 의미하는 반면 NULL은 개체가 없음을 나타냅니다.
NSray *array = @[@"Hello World!", @101, [NSNULL null] ];
여기서 [NSNULL null]은 개체가 없음을 의미하는 개체이며, 동시에 개체가 없음을 나타내기 위해 0을 추가할 수 없습니다.
확인에도 nil 및 [NSNull null]을(를) 모두 사용할 수 있습니다.
이것은 0, NIL 및 null의 차이를 이해하는 데 도움이 됩니다.
아래 링크는 어떤 식으로든 도움이 될 수 있습니다.
nil -> Objective-C 개체에 대한 리터럴 null 값입니다.
Nil -> Objective-C 클래스에 대한 리터럴 null 값입니다.
NULL -> C 포인터에 대한 리터럴 Null 값입니다.
null을 나타내는 데 사용되는 NSNULL -> singleton 개체입니다.
언급URL : https://stackoverflow.com/questions/1564410/when-should-i-use-nil-and-null-in-objective-c
'programing' 카테고리의 다른 글
"xcode-select-switch"를 설정한 후 Xcode가 작동을 중지함 (0) | 2023.05.28 |
---|---|
WPF 창에서 유형별로 모든 컨트롤 찾기 (0) | 2023.05.28 |
Makefile에서 셸 명령어를 사용하는 방법 (0) | 2023.05.28 |
Xcode 11에 Assistant Editor 누락 표시? (0) | 2023.05.28 |
WPF/MVVM 애플리케이션에서 종속성 주입을 처리하는 방법 (0) | 2023.05.28 |