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

Bir*_*chi 165 null objective-c nsnull

这是示例代码:

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]");
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用nil,NULL和[NSNull null]?

NSR*_*der 307

他们的类型不同.它们都是零,但它NULL是一个void *,nil是一个id,并且Nil是一个类指针.

  • 最好的解释我听说过差异(:谢谢. (13认同)
  • 'NULL` v`nil`的优雅描述,但这严重错过了标记re [NSNull null]`.请参阅_Number和值编程主题_的[使用NSNull](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html)部分和[NSNull类参考](https ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/Reference/Reference.html). (5认同)
  • 这应该是公认的答案,不是因为有更多的选票,而是因为它对提出的问题有最好的解释. (3认同)

Ale*_*lex 108

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

一般来说,只需使用nil.

  • 另外,在MacTypes.h中有`#define nil NULL` (41认同)
  • 这个被接受的答案没有承认`[NSNull null]`是一个非常不同的野兽.引用[NSNull类参考](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/Reference/Reference.html),"NSNull类定义单例用于表示集合对象中空值的对象(不允许使用nil值)." 另请参阅_Number和Value Programming Topics的[使用NSNull](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html)部分. (16认同)
  • 从技术上讲,它们完全相同,您可以将消息发送到nil和NULL.尽管nil通常用于表示对象 (12认同)
  • 是的,正如科巴尔所说,他们是一样的.它更像是一个上下文引用,其中NULL是指向0x0的指针,nil是一个不存在的objective-c对象,Nil是一个不存在的objective-c类,但从技术上讲它们都只是0.而且,它不是NULL null - null在Java或C#中,但不在Objective-C中. (7认同)

Sha*_*had 27

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

NSString *str = nil;
Run Code Online (Sandbox Code Playgroud)

如果我们处理一个对象,那么应该使用nil.

if(str==nil)
    NSLog("str is empty");
Run Code Online (Sandbox Code Playgroud)

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

char *myChar = NULL;
struct MyStruct *dStruct = NULL;
Run Code Online (Sandbox Code Playgroud)

所以,如果有某种情况,当我需要检查我的struct(结构类型变量)是否为空时,我将使用:

if (dStruct == NULL)
    NSLog("The struct is empty");
Run Code Online (Sandbox Code Playgroud)

让我们有另一个例子,

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

键值观察中,上下文应该是C指针或对象引用.在这里我们不能使用nil ; 我们必须使用NULL.

最后,NSNull类定义了一个单独的对象,用于表示集合对象中的空值(NSArray,NSDictionary).在[NSNull空]会返回NSNull的单一实例.基本上[NSNull null]是一个合适的对象.

无法将nil对象插入集合类型对象.我们举个例子:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];
Run Code Online (Sandbox Code Playgroud)

在第二行,我们不会得到任何错误,因为将NSNull对象插入集合类型对象是完全公平的.在第三行,我们将得到"对象不能为零"的错误.因为nil不是一个对象.


Chu*_*uck 19

NULL和nil彼此相等,但是nil是对象值,而NULL是通用指针值((void*)0具体而言).[NSNull null]是一个在不允许nil的情况下意味着零的对象.例如,NSArray中不能有nil值.所以,如果你需要代表一个"零",你可以使用[NSNull null].


小智 12

我发现了以下内容:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */
Run Code Online (Sandbox Code Playgroud)

_types.h

#define __DARWIN_NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)

STDDEF.H

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif
Run Code Online (Sandbox Code Playgroud)

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */
Run Code Online (Sandbox Code Playgroud)

它看起来的方式,没有区别,只有概念.


Nic*_*ini 8

小心if([NSNull null])返回true.


Nir*_*rav 6

它们都只是类型为零.从功能上讲,它们之间没有区别.即,

#define NULL ((void*)0)
#define nil ((id)0)
Run Code Online (Sandbox Code Playgroud)

有一点不同,但只有你自己和其他阅读代码的人,编译器并不关心.

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


Jus*_*ner 5

扩展来自@cobbal的评论:

MacTypes.h包含:

#ifndef nil
   #define nil NULL
#endif
Run Code Online (Sandbox Code Playgroud)


Gre*_*ker 5

在现代OS X和iOS SDK中:

  • nilNilNULL在Objective-C和C ++ 11之前的Objective-C ++中相同。
  • nilNilstd::nullptr在带有C ++ 11的Objective-C ++中相同。

从风格上讲,许多人喜欢将其nil用于Objective-C对象和/ NULLnullptr其他指针类型。我自己现在nil到处使用。

[NSNull null]单例对象,用于在nil被禁止作为值的情况下表示空值(通常在诸如NSArrayor 的集合对象中NSDictionary)。数字和值编程主题:使用NSNull