在`observeValueForKeyPath:ofObject:change:context:`方法中,文档在不指定上下文指针时为什么使用`NULL`而不是`nil`?
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
)。
observeValueForKeyPath:ofObject:change:context:
中的context
类型为void *
,这是否意味着作为context
传递的数据可能是一个对象指针?我认为这是一种常见情况。这就是为什么我对文档总是使用NULL
而不是nil
感到困惑的原因。 - erikprice从技术上讲它们是相同的(0),但通常使用nil来表示Objective-C对象类型,而使用NULL表示C风格指针(void *)。
它们在技术上是同一件事,只是风格不同:
id
类型(和对象指针)中使用 nil
。void *
中使用 NULL
。0
。我通常使用与类型声明语言相匹配的变体。
NULL
是 C 语言中的等价物
,指向空的指针;
而nil 是 id 类型的零
,
NULL 是 void* 类型的零
。
一个重要的点是你不能向 NULL 发送消息。因此,在 Objective-C 中,在许多地方使用 nil 更为常见。
它们几乎是相同的东西,除了:
nil
在 Objective-C 风格中使用。
而 NULL
用于 C 类型指针,并且被 typedef 为 (void *)
。