在 Objective-C 中什么时候应该使用 nil 和 NULL?

发布于 2024-08-08 06:48:54 字数 473 浏览 8 评论 0原文

这是示例代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

三五鸿雁 2024-08-15 06:48:54

它们的类型有所不同。它们都是零,但 NULLvoid *nilid,而 Nil 是一个类指针。

They differ in their types. They're all zero, but NULL is a void *, nil is an id, and Nil is a Class pointer.

纵情客 2024-08-15 06:48:54

您可以在任何可以使用 null 的地方使用 nil。主要区别在于你可以向nil发送消息,因此你可以在一些null无法工作的地方使用它。

一般来说,只需使用nil即可。

You can use nil about anywhere you can use null. The main difference is that you can send messages to nil, so you can use it in some places where null cant work.

In general, just use nil.

GRAY°灰色天空 2024-08-15 06:48:54

nil 是一个与对象(Objective-C 中的 id 类型)绑定/对应的空值。 nil 没有参考/地址,只是一个空值。

NSString *str = nil;

因此,如果我们正在处理一个对象,则应该使用 nil。

if(str==nil)
    NSLog("str is empty");

现在,NULL 用于 Objective-C 中的非对象指针(如 C 指针)。与 nil 一样,NULL 没有值也没有地址。

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

因此,如果有一种情况,当我需要检查我的 struct (结构类型变量)是否为空时,我会使用:

if (dStruct == NULL)
    NSLog("The struct is empty");

让我们再举一个例子,

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

键值观察,上下文应该是一个C指针或者一个对象引用。这里对于上下文我们不能使用nil;我们必须使用NULL

最后,NSNull类定义了一个单例对象,用于表示集合对象(NSArray、NSDictionary)中的空值。 [NSNull null] 将返回 NSNull 的单例实例。基本上 [NSNull null] 是一个正确的对象。

没有办法将 nil 对象插入到集合类型对象中。让我们举个例子:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject: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.

NSString *str = nil;

So nil should be used, if we are dealing with an object.

if(str==nil)
    NSLog("str is empty");

Now NULL is used for non-object pointer (like a C pointer) in Objective-C. Like nil , NULL got no value nor address.

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

So if there is a situation, when I need to check my struct (structure type variable) is empty or not then, I will use:

if (dStruct == NULL)
    NSLog("The struct is empty");

Let’s have another example, the

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

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:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

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.

划一舟意中人 2024-08-15 06:48:54

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].

心的位置 2024-08-15 06:48:54

我发现了以下内容:

objc.h

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

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

从外观上看,没有什么区别,只是概念上的区别。

I've found the following:

objc.h

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

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

The way it looks, there's no difference but a conceptual one.

归途 2024-08-15 06:48:54

请注意 if([NSNull null]) 返回 true

Beware that if([NSNull null]) returns true.

懒猫 2024-08-15 06:48:54

它们都只是类型化的零。从功能上来说,它们之间没有区别。
即,

#define NULL ((void*)0)
#define nil ((id)0)

存在差异,但仅对您自己和阅读代码的其他人而言,编译器不关心。

还有一件事 nil 是一个对象值,而 NULL 是一个通用指针值。

They both are just typecast zero's. Functionally, there's no difference between them.
ie.,

#define NULL ((void*)0)
#define nil ((id)0)

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.

北方的韩爷 2024-08-15 06:48:54

在现代 OS X 和 iOS SDK 中:

  • nilNil 以及 NULL 在 Objective-C 和
    C++11 之前的 Objective-C++。
  • nilNilstd::nullptr
    Objective-C++ 中与 C++11 相同。

从风格上来说,许多人更喜欢对 Objective-C 对象使用 nil ,对其他指针类型使用 NULLnullptr 。我自己现在到处都使用 nil

[NSNull null] 是一个 singleton 对象,用于表示 null 值禁止将 nil 作为值的情况(通常在集合对象中,例如 NSArrayNSDictionary)。 数字和值编程主题:使用 NSNull

In modern OS X and iOS SDKs:

  • nil and Nil and NULL are identical in Objective-C and in
    Objective-C++ before C++11.
  • nil and Nil and std::nullptr are
    identical in Objective-C++ with C++11.

Stylistically, many people prefer to use nil for Objective-C objects and NULL or nullptr for other pointer types. I myself now use nil everywhere.

[NSNull null] is a singleton object use to represent null values in situations where nil is prohibited as a value (typically in a collection object such as an NSArray or NSDictionary). Number and Value Programming Topics: Using NSNull

聊慰 2024-08-15 06:48:54

要扩展 @cobbal 的评论:

MacTypes.h 包含:

#ifndef nil
   #define nil NULL
#endif

To expand on a comment from @cobbal:

MacTypes.h contains:

#ifndef nil
   #define nil NULL
#endif
醉生梦死 2024-08-15 06:48:54

正如已经提到的,它们是相同的,但我根据编写相应框架的语言使用其中之一。

对于与 Objective-C 相关的所有内容,我都使用 nil。例如:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

但是,当检查 C 框架(如 AddressBook 框架和 CoreFoundation)中数据模型的有效性时,我使用 NULL。例如:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

这样,如果我正在处理 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:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

However, when checking validity of data models from a C-framework (like AddressBook framework and CoreFoundation), I use NULL. For example:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

This way, I have subtle clues in my code if I'm dealing with Obj-C or C based code.

萌化 2024-08-15 06:48:54

nil 是一个指向空的对象指针。
尽管在语义上与NULL不同,但它们在技术上等效彼此。

在框架层面,Foundation定义了NSNull,它定义了一个类方法+null,它返回单例NSNull对象。 NSNullnilNULL 不同,因为它是一个实际 对象 ,而不是零值。

此外,在 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

我要还你自由 2024-08-15 06:48:54

在某些情况下存在差异。

从字面上看,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.

故事与诗 2024-08-15 06:48:54

例如,当您使用类型为 (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.

高跟鞋的旋律 2024-08-15 06:48:54

基本上:
nil:对象上的空指针和
null:为其他类型指针

Basically:
nil: null pointer on an object and
null: is for other type pointer

过期情话 2024-08-15 06:48:54

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.

掩于岁月 2024-08-15 06:48:54

这将帮助您理解 nil、NIL 和 null 之间的区别。

以下链接可能会以某种方式帮助您:

http://nshipster.com/nil/

无 -> Objective-C 对象的文字 null 值。

无 -> Objective-C 类的文字 null 值。

空-> C 指针的文字空值。

NSNULL->用于表示 null 的单例对象。

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/

nil -> literal null value for Objective-C objects.

Nil -> literal null value for Objective-C classes.

NULL -> literal null value for C pointers.

NSNULL -> singleton object used to represent null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文