什么是最好的描述?真的是什么?

时间:2009-12-03 18:41:00

标签: objective-c cocoa cocoa-touch null

目前我将其理解为一种“空对象”。但究竟是什么呢?

9 个答案:

答案 0 :(得分:33)

Objective-C对象

首先,当你这样称呼时:

id someObject = [NSArray array];

someObject不是直接的数组对象,而只是指向它的指针。这意味着,如果someObject等于0x1234,那么内存中该地址就有一个对象。

这就是

的原因
id someOtherObject = someObject;

不会复制该对象。两个指针现在指向同一个对象。

指向0x0

的指针

那么,nil是如何定义的?我们来看看源代码:

objc.h

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

_types.h

#ifdef __cplusplus
…
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */

看起来nil是指向地址0x0的指针。

那又怎样?

让我们看看Objective-C Programming Reference所说的内容:

  

将消息发送到nil

     

在Objective-C中,发送一个   消息为零 - 它根本没有效果   在运行时。有几种模式   在Cocoa,利用这一点   事实。从a返回的值   消息为零也可能有效:...

返回的值为nil,0或struct,所有变量都初始化为0.它取决于预期的返回类型。对于nil的消息,在objective-c运行时中有一个明确的检查,这意味着它非常快。

NilnilNULL

这是3种类型。以下是所有定义:

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */
#define NULL __DARWIN_NULL
#define __DARWIN_NULL ((void *)0)

可以看出,它们完全相同。 Nilnil由Objective-C定义,NULL来自C。

那有什么区别?这只是关于风格。它使代码更具可读性。

  • Nil用作不存在的类:Class someClass = Nil
  • nil用作不存在的实例:id someInstance = nil
  • NULL是指向不存在的内存部分的指针:char *theString = NULL

nil不是空对象,而是不存在的对象。方法-getSomeObject如果不存在则不返回空对象,但会返回nil,告诉用户没有对象。

也许这是有道理的:(两者都会编译并运行。)

if (anObject == nil) {   // One cannot compare nothing to nothing,
                         // that wouldn't make sense.

if (anObject) {          // Correct, one checks for the existence of anObject

答案 1 :(得分:14)

它不是一个空物体,它根本就缺少任何物体。其余的答案涵盖了其他语义,所以我会留下它:)

答案 2 :(得分:7)

nil 只能用于指针,而 nil 表示指向的指针(它的值为零)

NSString *myString = nil; // myString points to nothing
int x = nil; // invalid, "x" is not a pointer, but it will compile

答案 3 :(得分:3)

这是“没有”。但是如果你试图在NULL上调用某个方法,那么你就可以发送消息而不会被杀死。

您可以查看this问题,了解有关NULLnil的更多信息

答案 4 :(得分:3)

这是null pointer - 指向“无”的指针。

答案 5 :(得分:1)

正式定义,就像Joshual定义的那样 - 一个指向任何东西的指针或一个根本没有指向对象的指针。

从实际的实施角度来看,特别是在处理数据结构和算法时,nill通常会代表数据结构中的标记或代表“无”的对象,例如,在红黑树中,技术上,所有叶节点都是“nill”,但它们仍具有相同或相似的属性。叶子节点的操作(颜色,指向父节点的指针等) - 在这些情况下,它实际上是一个“没有对象”......如果这有任何意义。

所以,正式地说,它是一个指向任何东西的指针,在实践中,它通常被视为没有任何表示,但它永远不会......无效。

答案 6 :(得分:1)

思考nil的一种有用方法是想象它是“无所事事”的空对象。

“无所事事”我的意思是,你发送的任何信息都不会有副作用。

它是“空的”,因为当你向它询问任何属性的值时,它总是返回nil。所以它没有任何价值 - >它是空的。
(实际上,当你要求返回一个不是obj-c对象的类型的属性的值时,它会比这更复杂。你会得到一个指针大小的0。所以对于任何标量您得到sizeof(void*)的值不大于0。但如果您在32位系统上要求structdouble,则未定义结果。我写过这个here。)

答案 7 :(得分:0)

也许我只是错过了显而易见但这似乎是一个语义问题。如同,您可以使用许多不同的词来描述它,但您的描述已经足够好了。

http://en.wikipedia.org/wiki/Null_(computer_programming)

答案 8 :(得分:-2)

只是澄清一下,在Objective-C中,nil和null不是一回事。它们在Objective-C中也不像在数学或其他编程语言中那样代表同样的东西。

Nil实际上是0x0的特殊内存地址(至少编译器将其视为地址。)Nil用作已命名但未分配的对象的地址。这允许测试命名对象的存在/分配,以及提供向可能不存在的对象发送消息的安全方法。在数学和某些语言中,你可以将标量变量与nil进行比较,在Objective-c中,你不应该。您应该只比较对象的地址。

相比之下,

NULL可以表示标准C定义为整数值NULL==0,或者它可以表示类NSNull的实际分配对象,在内存中具有特定地址。然而,NSNull是单个对象,即每个应用程序只存在一个对象。它通常用作集合中的其他对象的占位符。您不能将其用于与任何其他对象的比较。您只能检查特定指针是否指向单例NSNull对象。但请注意,作为已分配的对象[NSNull null]!=NULL

nil和NULL之间出现混淆,因为分配NULL地址会将其分配给0x0的nil地址。这样的代码有效,但有时会引起微妙的问题。最好养成不要混淆两者的习惯。

因此,在Objective-C中,nil,NUll和NSNull是三个不同但重叠的概念,容易混淆。 Nil应该用于地址,NULL应该用于标量值,NSNull应该用作分配对象的占位符。