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

时间:2009-10-14 05:29:19

标签: objective-c null 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]");

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

15 个答案:

答案 0 :(得分:297)

他们的类型不同。它们都为零,但NULLvoid *nilidNil为类指针。

答案 1 :(得分:102)

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

一般情况下,只需使用nil

答案 2 :(得分:25)

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对象插入到集合类型对象中是完全公平的。在第三行,我们将得到“对象不能为零”的错误。因为nil不是一个对象。

答案 3 :(得分:18)

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

答案 4 :(得分:7)

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

答案 5 :(得分:5)

扩展来自@cobbal的评论:

MacTypes.h包含:

#ifndef nil
   #define nil NULL
#endif

答案 6 :(得分:5)

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

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

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

nil是一个对象值,而NULL是一个通用指针值。

答案 7 :(得分:4)

在现代OS X和iOS SDK中:

  • nilNil以及NULL在Objective-C和in中完全相同 C ++ 11之前的Objective-C ++。
  • nil以及Nilstd::nullptr是 Objective-C ++与C ++ 11相同。

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

[NSNull null]是一个singleton对象,用于在nil被禁止作为值的情况下表示空值(通常在集合对象中,例如NSArray或{ {1}})。 Number and Value Programming Topics: Using NSNull

答案 8 :(得分:3)

如前所述,它们是相同的,但我使用的是其中之一,具体取决于编写相应框架的语言。

对于与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的代码,我的代码中会有细微的线索。

答案 9 :(得分:2)

在某些情况下存在差异。

从字面上看,Null是一个字符:ASCII 0.

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

根据编程环境,这可能是一个很大的不同。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

nil表示缺少值,而NULL表示无对象,

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

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

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

答案 12 :(得分:0)

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

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

http://nshipster.com/nil/

  

nil - > Objective-C对象的文字空值。

     

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

     

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

     

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

nil 是指向任何内容的对象指针。 虽然在语义上与 NULL 不同,但它们在技术上等效彼此。

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

此外,在Foundation / NSObjCRuntime.h中, Nil 被定义为 指针为零。

Refer this for further info - nil / Nil / NULL / NSNull