Objective-C中的NULL和nil有什么区别?

193
在`observeValueForKeyPath:ofObject:change:context:`方法中,文档在不指定上下文指针时为什么使用`NULL`而不是`nil`?

在我看来,object是nil,class是Nil,而NULL用于object或class。 - Thanh Vũ Trần
5个回答

233

nil只应该用于代替id,就像Java和C++程序员所认为的指向对象的指针。对于非对象指针,请使用NULL

查看该方法的声明:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

上下文是一个 void *(即C风格的指针),因此你肯定会使用 NULL(有时声明为 (void *)0)而不是 nil(它的类型是 id)。


3
但是,由于observeValueForKeyPath:ofObject:change:context:中的context类型为void *,这是否意味着作为context传递的数据可能是一个对象指针?我认为这是一种常见情况。这就是为什么我对文档总是使用NULL而不是nil感到困惑的原因。 - erikprice
2
上下文的类型:在该方法中是“void *”。 “nil”不是“void *”,但NULL是。 - Paul Tomblin
3
你可以使用“void*”作为指针类型。尽管如此,你是完全正确的,在这里使用NULL是正确的常量。 - Peter Hosey
3
他们说 void *. NULL 适用于 void *,而 nil 适用于 id。因此,你应该传递 NULL。如果你传递 nil,那么你就在欺骗读者,他们会认为这个方法需要一个 id 参数。 - Peter Hosey
13
换个角度来看,NULL是一个更广泛的类型,而nil是NULL的子集。一般来说,尽可能使用最广泛的类型(例如,在Java中,编写方法时应该使用Collection而不是Vector,除非你需要从Vector中获取某些特定的东西)。 - Paul Tomblin
显示剩余9条评论

67

从技术上讲它们是相同的(0),但通常使用nil来表示Objective-C对象类型,而使用NULL表示C风格指针(void *)。


8
此外,“NULL”与“nil”的定义不同。 “nil”被定义为“(id)0”。而“NULL”没有被定义。 - user142019
16
如果您仔细阅读MacTypes.h文件,会发现它声明了#define nil NULL。 - jbat100
1
这非常有趣。似乎除了风格点之外并不重要。就像YES/TRUE和NO/FALSE一样。 - Brennan
1
@Brennan,这并不完全正确,仅仅因为nil被定义为NULL并不意味着在幕后有其他隐藏的实现。例如,IBAction被定义为void,但是当在接口构建器中显示方法以附加到按钮等操作时,它具有不同的含义。 - Micaiah Wallace

54

它们在技术上是同一件事,只是风格不同:

  • Objective-C 风格建议在 id 类型(和对象指针)中使用 nil
  • C 风格建议在 void * 中使用 NULL
  • C++ 风格通常建议直接使用 0

我通常使用与类型声明语言相匹配的变体。


15

NULLC 语言中的等价物,指向空的指针;

nil 是 id 类型的零

NULL 是 void* 类型的零

一个重要的点是你不能向 NULL 发送消息。因此,在 Objective-C 中,在许多地方使用 nil 更为常见。


4

它们几乎是相同的东西,除了:

nil 在 Objective-C 风格中使用。 而 NULL 用于 C 类型指针,并且被 typedef 为 (void *)


1
这不是与此现有答案几乎重复吗? - Pang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接