什么时候应该在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]?     
已邀请:
您可以在任何可以使用的地方使用
nil
null
。主要区别在于您可以向
nil
发送消息,因此您可以在某些无法工作的地方使用它。 一般来说,只需使用
nil
。     
他们的类型不同。它们都是零,但是
NULL
void *
nil
id
,而
Nil
是一个类指针。     
nil是与对象绑定/对应的空值(Objective-C中的id类型)。没有引用/地址,只是一个空值。
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对象插入到集合类型对象中是完全公平的。在第三行,我们将得到“对象不能为零”的错误。因为nil不是一个对象。     
NULL和nil彼此相等,但是nil是对象值,而NULL是通用指针值(
(void*)0
,具体而言)。
[NSNull null]
是一个在不允许nil的情况下意味着零的对象。例如,NSArray中不能包含nil值。所以如果你需要代表一个“零”,你可以使用
[NSNull null]
。     
我发现了以下内容: 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 */
它看起来的方式,没有区别,只有一个概念。     
注意
if([NSNull null])
返回
true
。     
扩展来自@cobbal的评论: MacTypes.h包含:
#ifndef nil
   #define nil NULL
#endif
    
它们都只是类型为零。从功能上讲,它们之间没有区别。 即,
#define NULL ((void*)0)
#define nil ((id)0)
有一点不同,但只有你自己和其他阅读代码的人,编译器并不关心。 还有一件事是nil是对象值,而NULL是通用指针值。     
在现代OS X和iOS SDK中:
nil
Nil
NULL
在Objective-C和in中是相同的 C ++之前的Objective-C ++ 11。
nil
Nil
std::nullptr
是 Objective-C ++与C ++ 11完全相同。 在风格上,许多人更喜欢使用
nil
作为Objective-C对象,而
NULL
nullptr
作为其他指针类型。我自己现在到处都用
nil
[NSNull null]
是一个单例对象,用于在禁止
nil
作为值的情况下表示空值(通常在集合对象中,如
NSArray
NSDictionary
)。数字和值编程主题:使用NSNull     
如前所述,它们是相同的,但我使用其中一个或另一个,具体取决于编写相应框架的语言。 对于与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的代码,我的代码中会有细微的线索。     
在某些情况下存在差异。 从字面上看,Null是一个字符:ASCII 0。 Nil相当于空白,没有价值。 根据编程环境,这可能是一个很大的不同。     
例如,当您使用类型为(NSError **)的输出参数调用Objective-C方法时,请使用NULL。 我在网上看到很多示例代码,在这种情况下人们提供nil而不是NULL。这是因为它是指向指针的指针,因此不直接指向Objective-C对象类型。如上所述,nil应该用于Objective-C对象类型。     
nil表示缺少值,而NULL表示No Object, NSArray * array = @ [@“Hello World!”,@ 101,[NSNULL null]]; 这里[NSNULL null]是一个对象,表示没有对象,同时你不能添加nil来表示没有对象。 您也可以同时使用nil和[NSNUll null]进行检查。     
这将帮助您理解nil,NIL和null之间的区别。 以下链接可能会以某种方式帮助您: http://nshipster.com/nil/   nil - > Objective-C对象的文字空值。      Nil - > Objective-C类的文字空值。      NULL - > C指针的文字空值。      NSNULL - >用于表示null的单例对象。     
基本上: nil:对象上的空指针和 null:用于其他类型指针     
nil是一个没有任何东西的对象指针。 虽然在语义上与NULL不同,但它们在技术上彼此相同。 在框架级别,Foundation定义了NSNull,它定义了一个类方法+ null,它返回单例NSNull对象。 NSNull与nil或NULL不同,因为它是一个实际对象,而不是零值。 另外,在Foundation / NSObjCRuntime.h中,Nil被定义为一个什么都没有的类指针。 有关详细信息,请参阅此处 - nil / Nil / NULL / NSNull     

要回复问题请先登录注册