目录

iOS中nil 、NULL、 Nil 、NSNull的区别

1.nil

Defines the id of a null instance.

定义一个实例为空, 指向 oc 中对象的空指针.

示例代码:

1
2
3
4
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // do something

当对某个对象 release 的同时最好把他们赋值为 nil,这样可以确保安全性,如果不赋值 nil,可能导致程序崩溃.

1
2
3
4
5
6
7
8
NSArray * array = [NSArray arrayWithObjects:@"test",@"test1" ,nil];
[array release];
if (array)
{
    //仅仅对数组release,并没有赋值为nil,在程序某个地方如果继续对数组操作,程序直接崩溃
    NSString * string = [array objectAtIndex:0];
    NSLog(@"%@",string);
}

2.NULL

These macros define null values for classes and instances.

NULL可以用在C语言的各种指针上,

1
2
#define __DARWIN_NULL
#define __DARWIN_NULLConstants

示例代码:

1
2
3
int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

在 Objective-C 里,nil 对象被设计来跟 NULL 空指针关联的。他们的区别就是 nil 是一个对象,而 NULL 一个值。而且我们对于 nil 调用方法,不会产生 crash 或者抛出异常。

3.Nil

Defines the id of a null class.

定义一个空的类

Available in Mac OS X v10.0 through Mac OS X v10.4. Declared in NSObjCRuntime.h. Declared Inobjc.h

示例代码:

1
2
Class someClass = Nil;
Class anotherClass = [NSString class];

4.NSNull

The NSNull class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).

NSNull 类定义了一个单例对象用于表示集合对象的空值。

集合对象无法包含 nil 作为其具体值,如 NSArray、NSSet 和 NSDictionary。

相应地,nil 值用一个特定的对象 NSNull 来表示。NSNull 提供了一个单一实例用于表示对象属性中的的 nil 值。

默认的实现方法中,dictionaryWithValuesForKeys:setValuesForKeysWithDictionary:

自动地将 NSNull 和 nil 相互转换,因此您的对象不需要进行 NSNull 的测试操作。