nil、Nil、NULL、NSNull之间的区别

nil、Nil、NULL、NSNull之间的区别

nil的含义

指向一个对象的指针为空,用于给对象指针赋值为空,防止野指针的产生;也称nil为空对象:表示一个已经被释放了的对象,和值为空的对象(NSNull)不同。NSNull是一个对象,只不过这个对象的值为空

#ifndef nil
# if __has_feature(cxx_nullptr)
#   define nil nullptr
# else
#   define nil __DARWIN_NULL
# endif
#endif

给对象指针赋值为空:

NSString * name = nil;
NSString * url = nil;
id object = nil;

Nil的含义

指向一个类的指针为空,用于给类对象指针赋值为空

#ifndef Nil
# if __has_feature(cxx_nullptr)
#   define Nil nullptr
# else
#   define Nil __DARWIN_NULL
# endif
#endif

给类对象赋值为空:

Class class = Nil;

NULL的含义

指向C类型的指针,用于给C类型的指针赋值为空

#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
#  if !defined(__MINGW32__) && !defined(_MSC_VER)
#    define NULL __null
#  else
#    define NULL 0
#  endif
#else
#  define NULL ((void*)0)
#endif

给C类型指针赋值:

int * a = NULL;
char * ch = NULL;
struct aStruct = NULL;

NSNull的含义

NSNull是一个类,其继承自NSObject,只拥有一个类方法。实例对象表示这是一个内容为空的对象。主要用于数组、字典。

NSMutableArray * mArray = [NSMutableArray array];
[mArray addObject:[NSNull null]];
NSLog(@"%@", [mArray firstObject]); // 输出为:

NSMutableDictionary * dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"null"];
NSLog(@"%@", dict[@"null"]); // 输出为:

由此可见,可用NSNull的实例对象在数组、字典中占位,其所占有的位置为空。

nil、Nil、NULL的使用对比

先看下面做的一个实验:

NSArray * array = [NSArray arrayWithObjects:@"good", @"morning", nil];
//    array = nil; // 输出:0
//    array = NULL; // 输出:0
//    array = Nil; // 输出:0
    NSLog(@"%ld", array.count);
    // 分别使用上面三句注释的语句,输出值无区别
    
    
    Class class = [NSURL class];
//    class = Nil; // 输出:(null)
//    class = nil; // 输出:(null)
//    class = NULL; // 输出:(null)
    NSLog(@"%@", class);
    // 分别使用上面三句注释的语句,输出值无区别
    
    
    int a = 10;
    int * p = &a;
//    p = NULL; // 输出:0x0
//    p = nil; // 输出:0x0
//    p = Nil; // 输出:0x0
    NSLog(@"%p", p);
    // 分别使用上面三句注释的语句,输出值无区别

结论:

1> nil、Nil、NULL在使用上是没有什么区别的,但是程序员的一个约定:C结构的指针使用NULL;对象指针使用nil;类对象指针使用Nil。

2> 另外NSNull和nil、Nil、NULL具有本质上的区别。NSNull是一个对象,而nil、Nil、NULL只是给指针赋空值。

3> 在另外,给一个赋值为nil的对象发送消息,不会产生异常。当然给一个赋值为Nil、NULL的对象发送消息也不会产生异常,这个在例子中已经证实。故根据此条结论的总结为:nil、Nil、NULL目的都是给一个指针赋值为空,给空指针发送消息不会产生异常

你可能感兴趣的:(nil、Nil、NULL、NSNull之间的区别)