NULL vs nil在Objective-C中


182

observeValueForKeyPath:ofObject:change:context:-为什么在不指定上下文指针的情况下使用文档NULL而不是文档nil


在我看来,对象是nil,类是Nil,并且NULL用于对象或类
ThanhVũTrần2012年

Answers:


227

nil只能代替idJava和C ++程序员将其视为指向对象的指针使用。使用NULL非对象指针。

查看该方法的声明:

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

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


2
但是,由于contextin 的类型observeValueForKeyPath:ofObject:change:context:void *,这是否意味着作为传递的数据context可能是对象指针?我认为这是一个普遍的情况。这就是为什么我对为什么总是使用docs NULL而不是感到困惑的原因nil
erikprice

2
上下文类型:在该方法中为“ void *”。“ nil”不是“ void *”,而是NULL。
Paul Tomblin,2009年

3
您可以。void *是任何指针。但是,您绝对正确地认为NULL是正确的常数。
Peter Hosey

3
他们说无效*。NULL表示void *,nil表示id。因此,您传递NULL。如果您通过nil,则对您的读者说谎,他们会认为此方法使用id。
Peter Hosey,

12
换一种说法,NULL是更广泛的类型,而nil是NULL的子集。通常,使用您可以避免使用的最广泛的类型(即,在Java中,编写您的方法以期望Collection而不是Vector,除非您需要Vector中的特定内容)
Paul Tomblin 2009年

65

从技术上讲,它们是同一事物(0),但是nil通常用于Objective-C对象类型,而NULL用于c样式指针(void *)。


8
此外,NULL与的定义也不同nilnil定义为(id)0NULL不是。

14
@WTP如果您通过MacTypes.h进行读取,则会声明#define nil NULL
jbat100

1
那很有趣。看来这与样式点无关。就像是/是和否/否。
布伦南

1
@Brennan,那不是完全正确的,仅仅因为nil被定义为NULL并不意味着在幕后还有其他隐藏的实现。例如,IBAction被定义为void,但在显示用于附加到按钮等动作上的方法时,使用界面生成器时它具有不同的含义。
Micaiah Wallace

53

从技术上讲,它们是相同的,只是样式有所不同:

  • Objective-C风格说的nil是用于id类型(以及指向对象的指针)的内容。
  • C风格表示这NULL就是您的用意void *
  • C ++风格通常表示您应该只使用0

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


14

NULLC equivalentnil,一个指向什么;

其中nil is zero typed as id

NULL is zero typed as void*

重要的一点是您不能将消息发送到NULL。因此,最好在许多地方在目标C中使用nil。


4

他们几乎是同一回事,除了:

nil以Objective-C风格使用。其中NULLC类型指针用于,并被类型化为(void *)


1
这不是现有答案的重复吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.