在 Objective-C 中什么时候应该使用 nil 和 NULL?
这是示例代码:
NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)
if (myNumber == nil)
NSLog(@"test 1 myNumber == nil");
if (myNumber == NULL)
NSLog(@"test 2 myNumber == NULL");
if ([myNumber isEqual:[NSNull null]])
NSLog(@"test 3 myNumber == [NSNull null]");
什么时候应该使用 nil、NULL 和 [NSNull null]?
This is sample code:
NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)
if (myNumber == nil)
NSLog(@"test 1 myNumber == nil");
if (myNumber == NULL)
NSLog(@"test 2 myNumber == NULL");
if ([myNumber isEqual:[NSNull null]])
NSLog(@"test 3 myNumber == [NSNull null]");
When should I use nil, NULL and [NSNull null]?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
它们的类型有所不同。它们都是零,但
NULL
是void *
,nil
是id
,而Nil
是一个类指针。They differ in their types. They're all zero, but
NULL
is avoid *
,nil
is anid
, andNil
is a Class pointer.您可以在任何可以使用
null
的地方使用nil
。主要区别在于你可以向nil
发送消息,因此你可以在一些null
无法工作的地方使用它。一般来说,只需使用
nil
即可。You can use
nil
about anywhere you can usenull
. The main difference is that you can send messages tonil
, so you can use it in some places wherenull
cant work.In general, just use
nil
.nil 是一个与对象(Objective-C 中的 id 类型)绑定/对应的空值。 nil 没有参考/地址,只是一个空值。
因此,如果我们正在处理一个对象,则应该使用 nil。
现在,NULL 用于 Objective-C 中的非对象指针(如 C 指针)。与 nil 一样,NULL 没有值也没有地址。
因此,如果有一种情况,当我需要检查我的 struct (结构类型变量)是否为空时,我会使用:
让我们再举一个例子,
键值观察,上下文应该是一个C指针或者一个对象引用。这里对于上下文我们不能使用nil;我们必须使用NULL。
最后,NSNull类定义了一个单例对象,用于表示集合对象(NSArray、NSDictionary)中的空值。 [NSNull null] 将返回 NSNull 的单例实例。基本上 [NSNull null] 是一个正确的对象。
没有办法将 nil 对象插入到集合类型对象中。让我们举个例子:
在第二行,我们不会得到任何错误,因为将 NSNull 对象插入到集合类型对象中是完全公平的。在第三行,我们将得到“object can be nil”错误。因为 nil 不是一个对象。
nil is an empty value bound/corresponding with an object (the id type in Objective-C). nil got no reference/address, just an empty value.
So nil should be used, if we are dealing with an object.
Now NULL is used for non-object pointer (like a C pointer) in Objective-C. Like nil , NULL got no value nor address.
So if there is a situation, when I need to check my struct (structure type variable) is empty or not then, I will use:
Let’s have another example, the
Of key-value observing, the context should be a C pointer or an object reference. Here for the context we can not use nil; we have to use NULL.
Finally the NSNull class defines a singleton object used to represent null values in collection objects(NSArray, NSDictionary). The [NSNull null] will returns the singleton instance of NSNull. Basically [NSNull null] is a proper object.
There is no way to insert a nil object into a collection type object. Let's have an example:
On the second line, we will not get any error, because it is perfectly fair to insert a NSNull object into a collection type object. On the third line, we will get "object cannot be nil" error. Because nil is not an object.
NULL 和 nil 彼此相等,但 nil 是一个对象值,而 NULL 是一个通用指针值(具体来说是
(void*)0
)。[NSNull null]
是一个对象,在不允许 nil 的情况下代表 nil。例如,NSArray 中不能有 nil 值。因此如果需要表示“nil”,可以使用[NSNull null]
。NULL and nil are equal to each other, but nil is an object value while NULL is a generic pointer value (
(void*)0
, to be specific).[NSNull null]
is an object that's meant to stand in for nil in situations where nil isn't allowed. For example, you can't have a nil value in an NSArray. So if you need to represent a "nil", you can use[NSNull null]
.我发现了以下内容:
objc.h
_types.h
stddef.h
MacTypes.h
从外观上看,没有什么区别,只是概念上的区别。
I've found the following:
objc.h
_types.h
stddef.h
MacTypes.h
The way it looks, there's no difference but a conceptual one.
请注意
if([NSNull null])
返回true
。Beware that
if([NSNull null])
returnstrue
.它们都只是类型化的零。从功能上来说,它们之间没有区别。
即,
存在差异,但仅对您自己和阅读代码的其他人而言,编译器不关心。
还有一件事 nil 是一个对象值,而 NULL 是一个通用指针值。
They both are just typecast zero's. Functionally, there's no difference between them.
ie.,
There is a difference, but only to yourself and other humans that read the code, the compiler doesn't care.
One more thing nil is an object value while NULL is a generic pointer value.
在现代 OS X 和 iOS SDK 中:
nil
和Nil
以及NULL
在 Objective-C 和C++11 之前的 Objective-C++。
nil
和Nil
和std::nullptr
是Objective-C++ 中与 C++11 相同。
从风格上来说,许多人更喜欢对 Objective-C 对象使用
nil
,对其他指针类型使用NULL
或nullptr
。我自己现在到处都使用nil
。[NSNull null]
是一个 singleton 对象,用于表示 null 值禁止将nil
作为值的情况(通常在集合对象中,例如NSArray
或NSDictionary
)。 数字和值编程主题:使用 NSNullIn modern OS X and iOS SDKs:
nil
andNil
andNULL
are identical in Objective-C and inObjective-C++ before C++11.
nil
andNil
andstd::nullptr
areidentical in Objective-C++ with C++11.
Stylistically, many people prefer to use
nil
for Objective-C objects andNULL
ornullptr
for other pointer types. I myself now usenil
everywhere.[NSNull null]
is a singleton object use to represent null values in situations wherenil
is prohibited as a value (typically in a collection object such as anNSArray
orNSDictionary
). Number and Value Programming Topics: Using NSNull要扩展 @cobbal 的评论:
MacTypes.h 包含:
To expand on a comment from @cobbal:
MacTypes.h contains:
正如已经提到的,它们是相同的,但我根据编写相应框架的语言使用其中之一。
对于与 Objective-C 相关的所有内容,我都使用 nil。例如:
但是,当检查 C 框架(如 AddressBook 框架和 CoreFoundation)中数据模型的有效性时,我使用 NULL。例如:
这样,如果我正在处理 Obj-C 或基于 C 的代码,我的代码中就会有微妙的线索。
As already mentioned, they are the same, but I use either the one or the other depending on the language in which the corresponding framework was written.
For everything related to Objective-C, I use nil. For example:
However, when checking validity of data models from a C-framework (like AddressBook framework and CoreFoundation), I use NULL. For example:
This way, I have subtle clues in my code if I'm dealing with Obj-C or C based code.
nil 是一个指向空的对象指针。
尽管在语义上与NULL不同,但它们在技术上等效彼此。
在框架层面,Foundation定义了NSNull,它定义了一个类方法+null,它返回单例NSNull对象。 NSNull 与 nil 或 NULL 不同,因为它是一个实际 对象 ,而不是零值。
此外,在 Foundation/NSObjCRuntime.h 中,Nil 被定义为指向空的类指针。
请参阅此处以获取更多信息 - nil / Nil / NULL / NSNull
nil is an object pointer to nothing.
Although semantically distinct from NULL, they are technically equivalent to one another.
On the framework level, Foundation defines NSNull, which defines a class method, +null, which returns the singleton NSNull object. NSNull is different from nil or NULL, in that it is an actual object, rather than a zero value.
Additionally, in Foundation/NSObjCRuntime.h, Nil is defined as a class pointer to nothing.
Refer this for further info - nil / Nil / NULL / NSNull
在某些情况下存在差异。
从字面上看,Null 是一个字符:ASCII 0。Nil
相当于空白,没有值。
根据编程环境的不同,这可能会有很大的差异。
There is a difference in some contexts.
Literally, Null is a character: ASCII 0.
Nil is equivalent to blank, no value.
Depending on the programming context, this can be a big difference.
例如,当您使用类型为 (NSError **) 的输出参数调用 Objective-C 方法时,请使用 NULL。
我在网上看到很多示例代码,在这种情况下,人们提供 nil 而不是 NULL。这是因为它是一个指向指针的指针,因此不直接是 Objective-C 对象类型。如上所述,nil 应该用于 Objective-C 对象类型。
Use NULL for example when you invoke an Objective-C method with an output parameter of type (NSError **).
I see lots of example code on the web where people provide nil instead of NULL in this case. This is because it's a pointer to a pointer and thus not directly an Objective-C object type. As said above, nil should be used for Objective-C object types.
基本上:
nil:对象上的空指针和
null:为其他类型指针
Basically:
nil: null pointer on an object and
null: is for other type pointer
nil 表示没有值,NULL 表示无对象,
NSArray *array = @[@"Hello World !", @101,[NSNULL null] ];
这里[NSNULL null]是一个对象,表示没有对象,同时不能添加nil来表示没有对象。
您也可以使用 nil 和 [NSNUll null] 进行检查。
nil means absence of value while NULL represent No Object,
NSArray *array = @[@"Hello World !", @101,[NSNULL null] ];
Here [NSNULL null] is an object which means no object, at the same time you cannot add nil to indicate absence of object.
you can use both nil and [NSNUll null] for checking too.
这将帮助您理解 nil、NIL 和 null 之间的区别。
以下链接可能会以某种方式帮助您:
http://nshipster.com/nil/
This will help you to understand the difference between nil, NIL and null.
The below link may help you in some way:
http://nshipster.com/nil/