Objective-C中nil,NIL和null之间的区别
我想知道nil
, NIL
和null
之间的区别。 我search了一下,发现这个:
nil
– >指向Objective-C对象的空指针
NIL
– >指向Objective-C类的空指针
null
– > null指向原始types或不存在数据的指针
但是我无法清楚地理解“Objective-C对象”和“类”这两个术语。
请给我解释一下。 另外,Objective-C中是否有像NSNull
或NSNil
这样的NSNull
? 如果是这样,那么请解释它是什么。
nil
是Objective-C对象的文字空值,对应于抽象typesid
或通过@interface
声明的任何Objective-Ctypes。 例如:
NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something
Nil
是Objective-C类的字面空值,对应于typesClass
。 由于大多数代码不需要variables来引用类,所以它的使用并不常见。 一个例子是:
Class someClass = Nil; Class anotherClass = [NSString class];
NULL
是任意C指针的文字空值。 例如,
int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL;
NSNull
是表示null的对象的类。 实际上,只有一个对象,即+[NSNull null]
返回的对象。 它与nil
不同,因为nil
是一个文字空值,即它不是一个对象。 另一方面, NSNull
的单一实例是一个适当的对象。
NSNull
通常用于Foundation集合,因为它们不能存储nil
值。 在字典的情况下, -objectForKey:
返回nil
表示给定的键在字典中没有对应的对象,即该键没有被添加到字典中。 如果你想明确说明你有一个特定的键,但是它还没有值,你可以使用[NSNull null]
。
例如,下面的代码会抛出一个exception,因为字典不能存储nil
值:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"someKey"];
另一方面,下面的代码是有效的,因为[NSNull null]
是一个非零对象:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNull null] forKey:@"someKey"];
值得一提的是,基础集合的初始化程序使用nil
作为对象列表末尾的标记,而不必指定列表中元素的数量。 这只能发生,因为无法存储在基金会collections。 例如,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
至于NIL
或NSNil
,在Objective-C或Apple基金会中没有这样的事情。
我不确定,但是我认为nil
只能用来代替id
,Java和C ++程序员会认为它是pointer
object
的pointer
。 对非对象指针使用NULL
。
nil
通常用于Objective-C对象types,而NULL
用于c样式指针
假设你有一个MyClass
类,那么按照惯例,如果你想将它的实例初始化为null值(和java中的null
相同),
MyClass *obj = nil;
如果你想初始化一个基本指针为空值(与c中相同)你使用
int *ptr = NULL;
如果你想初始化为空值的Class
引用(与Java中的null
相同),则使用
Class classRefOfMyClass = Nil;
这只是一个惯例,否则零或零具有相同的含义,也许NULL,零或零都是相同的。
这里是objc.h
文件中的这些定义
#ifndef Nil # if __has_feature(cxx_nullptr) # define Nil nullptr # else # define Nil __DARWIN_NULL # endif #endif #ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
并在stddef.h
#define NULL ((void*)0)
在_types.h
定义_types.h
#define __DARWIN_NULL ((void *)0)
所以逻辑上没有区别。 这里的主要思想是将C
或Objective-C
的指针初始化为0
。 如果你有C
知识,那么你可以分配
int *ptr = 0;
没有types铸造0
到指针。 因为您不需要强制转换0
来将其分配给指针。
总之,他们都是0
,没有别的。
零,零和零。 取决于你的要求。
NSNull
像NSArray
和NSDictionary
集合不能包含零值。
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary]; MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey" NSLog(@"Keys: %@", [mutableDictionary allKeys]);
零
所有指向其他对象的指针都以nil开头,所以没必要在init方法中设置self。(association)= nil。
在其他语言中,如C ++,这会使你的程序崩溃,但是在Objective-C中,在nil上调用一个方法会返回一个零值。
if (name != nil) { ........ }
符号值的含义
nil(id)0 Objective-C对象的空值
Objective-C类的Nil(Class)0 null null值
零,零和零用于下面
1>目标c类为零
对于Objective C对象,2> nil
3> C指针为空
例:
1> A类=无;
2> NSString strName = nil;
3> char * pointerChar = NULL;
这将帮助你理解nil,NIL和null之间的区别。
所有这三个值表示空值或零指针值。 不同的是,尽pipeNULL表示任何指针为零,但 nil是特定于对象的 (例如id),而Nil是特定于类指针的。 在正确的情况下使用正确的空对象作为logging的目的应该被认为是一种最佳实践,即使没有任何东西阻止某个人混合和匹配。
下面的链接可能会以某种方式帮助你:
以下是链接中的一些重要部分: