什么时候应该在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]?

你可以在任何你可以使用null地方使用nil 。 主要区别是你可以发送消息到nil ,所以你可以使用它在一些无法工作的地方。

一般来说,只需使用nil

他们的types不同。 它们都是零,但是NULL是一个void *nil是一个id ,而Nil是一个Class指针。

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

 NSString *str = nil; 

所以如果我们正在处理一个对象,那么应该使用零。

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

现在,在Objective-C中, NULL被用于非对象指针 (如C指针)。 像NULL没有价值,也没有地址。

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

所以如果有这样的情况,当我需要检查我的结构 (结构typesvariables)是否为空时,我将使用:

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

我们再来举个例子

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

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

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

没有办法将nil对象插入到集合types对象中。 举个例子吧:

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

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

NULL和nil是相等的,但是nil是一个对象值,而NULL是一个generics指针值( (void*)0 ,具体)。 [NSNull null]是一个对象,在nil不允许的情况下表示为零。 例如,你不能在NSArray中有一个零值。 所以如果你需要表示一个“无”,你可以使用[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 

他们都只是types零。 在function上,它们之间没有任何区别。 即,

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

有一个区别,但只有你自己和其他读取代码的人,编译器不关心。

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

在现代OS X和iOS SDK中:

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

在风格上,许多人喜欢使用nil对Objective-C对象和NULLnullptr其他指针types。 我现在在任何地方都使用nil

[NSNull null]是一个单例对象,用于在nil被禁止作为值的情况下(通常在NSArrayNSDictionary等集合对象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。

无相当于空白,没有价值。

根据编程的情况,这可能是一个很大的区别。

当您使用types为(NSError **)的输出参数调用Objective-C方法时,使用NULL。

我在网上看到很多示例代码,在这种情况下,人们提供nil而不是NULL。 这是因为它是一个指向指针的指针,因此不是直接指向一个Objective-C对象types。 如上所述,nil应该用于Objective-C对象types。

nil表示不存在值,NULL表示无对象,

NSArray * array = @ [@“Hello World!”,@ 101,[NSNULL null]];

这里[NSNULL null]是一个对象,意思是没有对象,同时你不能添加nil来表示不存在对象。

你也可以同时使用nil和[NSNUull null]进行检查。

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

下面的链接可能会以某种方式帮助你:

http://nshipster.com/nil/

nil – > Objective-C对象的空值。

Objective-C类的Nil – > literal null值。

NULL – > C指针的文字空值。

NSNULL – >用来表示null的单例对象。