问题描述
目前我明白它是一种空对象。但是它真的是什么?
Currently I understand it as a kind of "empty object". But what's it really?
推荐答案
Objective-C对象
当你调用这个:
Objective-C objects
First of all, when you call this:
id someObject = [NSArray array];
someObject
但只有一个指针。这意味着,如果 someObject
等于 0x1234
,那么在内存中的那个地址有一个对象。
someObject
isn't the array object directly but only a pointer to it. That means, if someObject
is equal to 0x1234
there's an object at that address in the memory.
这是为什么
id someOtherObject = someObject;
不复制对象。两个指针现在指向同一个对象。
doesn't copy the object. Both pointers point now to the same object.
c> nil 定义?让我们来看看源代码:
So, how is nil
defined? Let's take a look at the source code:
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的指针。
Looks like nil
is a pointer to the address 0x0.
让我们看看必须说:
返回的值为 nil
,0或 struct
,所有变量初始化为0.哪一个取决于预期的返回类型。在objective-c运行时显式检查 nil
的消息,这意味着它真的很快。
The returned values are either nil
, 0 or a struct
with all variables initialized to 0. Which one it is depends on the expected return type. There is an explicit check in the objective-c runtime for messages to nil
, that means it's really fast.
这3种类型。以下是所有定义:
Those are the 3 types. Here are all the definitions:
#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)
可以看出,它们都完全相同。 Nil
和 nil
由Objective-C, NULL
来自C。
As can be seen, they are all exactly the same. Nil
and nil
are defined by Objective-C, NULL
comes from C.
有什么区别?这只是关于风格。它使代码更具可读性。
What's the difference then? It's only about style. It makes the code more readable.
-
Nil
用作不存在class:Class someClass = Nil
。 -
nil
-existent instance:id someInstance = nil
。 -
NULL
到不存在的存储器部分:char * theString = NULL
。
Nil
is used as a non-existent class:Class someClass = Nil
.nil
is used as a non-existent instance:id someInstance = nil
.NULL
is a pointer to a non-existent memory part:char *theString = NULL
.
nil
不是一个空对象,而是一个不存在的对象。方法 -getSomeObject
不返回空对象,如果它不存在但返回 nil
,它告诉用户没有对象。
nil
isn't an empty object but a non-existent one. A method -getSomeObject
doesn't return an empty object if it doesn't exist but returns nil
which tells the user that there is no object.
也许这是有道理的:(两者都将编译并运行。)
Maybe this makes sense: (Both would compile and run.)
if (anObject == nil) { // One cannot compare nothing to nothing,
// that wouldn't make sense.
if (anObject) { // Correct, one checks for the existence of anObject
这篇关于什么描述最好?真的是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!