172

这是示例代码:

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]?

4

16 回答 16

319

它们的类型不同。它们都为零,但是NULL是 a void *nil是 a id,并且Nil是 Class 指针。

于 2009-10-14T07:49:02.870 回答
119

您可以在任何可以使用nil的地方使用null. 主要区别在于可以发送消息到nil,所以可以在一些null不能工作的地方使用。

一般来说,只需使用nil.

于 2009-10-14T05:32:48.717 回答
30

nil是一个与对象绑定/对应的空值(Objective-C 中的 id 类型)。nil没有参考/地址,只是一个空值。

NSString *str = nil;

因此,如果我们正在处理一个对象,则应该使用 nil。

if(str==nil)
    NSLog("str is empty");

现在NULL用于Objective-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 指针或对象引用。这里的上下文我们不能使用nil;我们必须使用NULL

最后,NSNull类定义了一个单例对象,用于表示集合对象(NSArray,NSDictionary)中的空值。[NSNull null]将返回 NSNull的单例实例。基本上[NSNull null]是一个合适的对象。

无法将 nil 对象插入到集合类型对象中。让我们举个例子:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

在第二行,我们不会得到任何错误,因为将 NSNull 对象插入到集合类型对象中是完全公平的。在第三行,我们会得到“object cannot be nil”错误。因为 nil 不是对象。

于 2013-05-29T08:20:02.730 回答
19

NULL 和 nil 彼此相等,但 nil 是一个对象值,而 NULL 是一个通用指针值((void*)0具体来说是 )。[NSNull null]是一个在不允许 nil 的情况下代表 nil 的对象。例如,在 NSArray 中不能有 nil 值。所以如果你需要表示一个“nil”,你可以使用[NSNull null].

于 2009-10-14T07:56:35.757 回答
12

我发现了以下内容:

对象.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

标准定义文件

#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 */

从外观上看,没有区别,只是概念上的区别。

于 2012-11-09T01:35:19.420 回答
8

当心if([NSNull null])返回true

于 2013-12-05T09:41:35.220 回答
7

它们都只是类型转换的零。从功能上讲,它们之间没有区别。IE。,

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

存在差异,但仅对您自己和其他阅读代码的人而言,编译器不在乎。

还有一件事 nil 是一个对象值,而 NULL 是一个通用指针值。

于 2012-11-17T15:26:49.927 回答
6

在现代 OS X 和 iOS SDK 中:

  • nilNilNULL在 Objective-C 和 C++11 之前的 Objective-C++ 中是相同的。
  • nilNilstd::nullptr在 Objective-C++ 中与 C++11 相同。

从风格上讲,许多人更喜欢nil用于 Objective-C 对象和NULL/或nullptr其他指针类型。我自己现在nil到处都在使用。

[NSNull null]是一个单例对象,用于在禁止作为值的情况下表示空值nil(通常在集合对象中,例如 anNSArrayNSDictionary)。数字和值编程主题:使用 NSNull

于 2013-09-01T21:06:34.717 回答
5

要扩展来自@cobbal 的评论:

MacTypes.h包含:

#ifndef nil
   #define nil NULL
#endif
于 2012-03-11T15:08:16.290 回答
4

如前所述,它们是相同的,但我使用其中一种或另一种取决于编写相应框架的语言。

对于与 Objective-C 相关的所有内容,我使用 nil。例如:

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

    // process elements
    ...
}

但是,当从 C 框架(如 AddressBook 框架和 CoreFoundation)检查数据模型的有效性时,我使用 NULL。例如:

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

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

这样,如果我正在处理基于 Obj-C 或 C 的代码,我的代码中就会有微妙的线索。

于 2012-04-04T09:28:33.393 回答
4

nil是一个无指向的对象指针。尽管在语义上与NULL不同,但它们在技术上是等价的。

在框架层面,Foundation 定义了NSNull,它定义了一个类方法 +null,它返回单例 NSNull 对象。NSNullnilNULL不同,因为它是一个实际的 object,而不是一个零值。

此外,在 Foundation/NSObjCRuntime.h 中,Nil被定义为指向空的 指针

请参阅此以获取更多信息 - nil / Nil / NULL / NSNull

于 2018-02-15T05:52:11.980 回答
3

在某些情况下存在差异。

从字面上看,Null 是一个字符:ASCII 0。

Nil 相当于空白,没有值。

根据编程上下文,这可能会有很大的不同。

于 2013-10-09T17:13:49.127 回答
1

例如,当您使用类型为 (NSError **) 的输出参数调用 Objective-C 方法时,请使用 NULL。

我在网上看到很多示例代码,在这种情况下人们提供 nil 而不是 NULL。这是因为它是指向指针的指针,因此不直接是 Objective-C 对象类型。如上所述,nil 应该用于 Objective-C 对象类型。

于 2013-02-18T02:52:40.357 回答
1

基本上: nil:对象上的空指针和 null:用于其他类型的指针

于 2018-01-10T20:55:30.023 回答
0

nil 表示没有值,而 NULL 表示没有对象,

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

这里的 [NSNULL null] 是一个对象,表示没有对象,同时你不能添加 nil 来表示没有对象。

您也可以同时使用 nil 和 [NSNUll null] 进行检查。

于 2017-07-01T21:16:28.667 回答
0

这将帮助您了解 nil、NIL 和 null 之间的区别。

以下链接可能会以某种方式帮助您:

http://nshipster.com/nil/

nil -> Objective-C 对象的文字空值。

Nil -> Objective-C 类的文字空值。

NULL -> C 指针的文字空值。

NSNULL -> 用于表示 null 的单例对象。

于 2017-07-05T08:00:43.127 回答