Objective-C中的NULL与nil

eri*_*ice 180 null cocoa objective-c

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

Pau*_*lin 227

nil应该只用来代替一个id,我们Java和C++程序员会认为它是一个指向对象的指针.使用NULL非对象指针.

看一下该方法的声明:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context
Run Code Online (Sandbox Code Playgroud)

Context是一个void *(即一个C风格的指针),所以你肯定使用NULL(有时被声明为(void *)0)而不是nil(它是类型id).

  • 或者以另一种方式来思考,NULL是一种更宽泛的类型,而nil是NULL的子集.一般情况下,使用您可以使用的最广泛的类型(即在Java中,编写您的方法以期望Collection而不是Vector,除非您需要来自Vector的特定内容) (12认同)
  • 您可以.void*是任何指针.尽管如此,你绝对正确,NULL是那里正确的常量. (3认同)
  • 他们说无效*.NULL表示void*,nil表示id.因此,您传递NULL.如果你通过nil,那么你就会对你的读者撒谎,他会认为这种方法需要一个id. (3认同)
  • 但是因为`observeValueForKeyPath:ofObject:change:context:`中的`context`的类型是`void*`,这是不是意味着作为`context`传递的数据可能是一个对象指针?我认为这是一个常见的案例.这就是为什么我很困惑为什么文档总是使用`NULL`而不是`nil`. (2认同)
  • 上下文的类型:在该方法中是"void*"."nil"不是"void*",但是NULL. (2认同)

Mar*_*eau 64

它们在技术上是相同的(0),但是nil通常用于Objective-C对象类型,而NULL用于c样式指针(void*).

  • @WTP如果您通过MacTypes.h阅读,它会声明#define nil NULL (14认同)
  • 此外,`NULL`的定义不同于`nil`.`nil`定义为`(id)0`.`NULL`不是. (8认同)

And*_*rew 53

它们在技术上是相同的,仅在风格上有所不同:

  • Objective-C样式表示nil用于id类型(和指向对象的指针).
  • C风格说这NULL就是你用的void *.
  • C++风格通常表示您应该使用0.

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

  • C++ 11现在使用nullptr而不是0来表示空指针 (6认同)

小智 13

NULLC equivalentnil,一个指向什么;

哪里nil is zero typed as id,

NULL is zero typed as void*.

一个重要的一点是你无法将消息发送到NULL.所以最好在很多地方使用物镜C中的nil.