这是示例代码:
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]?
答案 0 :(得分:297)
他们的类型不同。它们都为零,但NULL
为void *
,nil
为id
,Nil
为类指针。
答案 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)
答案 6 :(得分:5)
它们都只是类型零。从功能上讲,它们之间没有区别。 即,
#define NULL ((void*)0)
#define nil ((id)0)
有区别,但只有你自己和其他阅读代码的人,编译器并不关心。
nil是一个对象值,而NULL是一个通用指针值。
答案 7 :(得分:4)
在现代OS X和iOS SDK中:
nil
和Nil
以及NULL
在Objective-C和in中完全相同
C ++ 11之前的Objective-C ++。nil
以及Nil
和std::nullptr
是
Objective-C ++与C ++ 11相同。在风格上,许多人更喜欢将nil
用于Objective-C对象,而NULL
或nullptr
用于其他指针类型。我自己现在到处都使用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之间的区别。
以下链接可能会以某种方式为您提供帮助:
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 被定义为类 指针为零。