Objective-C中nil,NIL和null之间的区别

我想知道nilNILnull之间的区别。 我search了一下,发现这个:

nil – >指向Objective-C对象的空指针

NIL – >指向Objective-C类的空指针

null – > null指向原始types或不存在数据的指针

但是我无法清楚地理解“Objective-C对象”和“类”这两个术语。

请给我解释一下。 另外,Objective-C中是否有像NSNullNSNil这样的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]; 

至于NILNSNil ,在Objective-C或Apple基金会中没有这样的事情。

我不确定,但是我认为nil只能用来代替id ,Java和C ++程序员会认为它是pointer objectpointer 。 对非对象指针使用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) 

所以逻辑上没有区别。 这里的主要思想是将CObjective-C的指针初始化为0 。 如果你有C知识,那么你可以分配

 int *ptr = 0; 

没有types铸造0到指针。 因为您不需要强制转换0来将其分配给指针。

总之,他们都是0 ,没有别的。

零,零和零。 取决于你的要求。

NSNull

NSArrayNSDictionary集合不能包含零值。

 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的目的应该被认为是一种最佳实践,即使没有任何东西阻止某个人混合和匹配。

下面的链接可能会以某种方式帮助你:

http://nshipster.com/nil/

以下是链接中的一些重要部分:

在这里输入图像描述