一、NULL
stddef.h文件
#undef NULL
#ifdef __cplusplus
#? if !defined(__MINGW32__) && !defined(_MSC_VER)
#? ? define NULL __null
#? else
#? ? define NULL 0
#? endif
#else
#? define NULL ((void*)0)
#endif
其中__cplusplus表示是不是C++代碼,所以對于普通的iOS開發(fā)者來說,通常NULL的定義就是:
# define NULL ((void*)0)
因此没陡,NULL本質(zhì)上是:(void*)0
NULL表示C指針為空
char *string = NULL;
二盼玄、nil
objc.h文件
#ifndef nil
# if __has_feature(cxx_nullptr)
#? define nil nullptr
# else
#? define nil __DARWIN_NULL
# endif
#endif
其中__has_feature(cxx_nullptr)用于判斷C++中是否有nullptr特性埃儿,對于普通iOS開發(fā)者來說器仗,nil的定義形式為:
# define nil __DARWIN_NULL
就是說nil最終是__DARWIN_NULL的宏定義,__DARWIN_NULL是定義在_types.h中的宏童番,其定義形式如下:
#ifdef __cplusplus
#ifdef __GNUG__
#define __DARWIN_NULL __null
#else /* ! __GNUG__ */
#ifdef __LP64__
#define __DARWIN_NULL (0L)
#else /* !__LP64__ */
#define __DARWIN_NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */
非C++代碼的__DARWIN_NULL最終定義形式如下
#define __DARWIN_NULL ((void *)0)
也就是說青灼,nil本質(zhì)上是:(void *)0
用于表示指向Objective-C中對象的指針為空
NSString *string = nil;
id anyObject = nil;
三杂拨、Nil
objc.h文件
#ifndef Nil
# if __has_feature(cxx_nullptr)
#? define Nil nullptr
# else
#? define Nil __DARWIN_NULL
# endif
#endif
和上面講到的nil一樣弹沽,Nil本質(zhì)上也是:(void *)0
用于表示Objective-C類(Class)類型的變量值為空
Class anyClass = Nil;
四策橘、NSNull
NSNull.h文件
@interface NSNull : NSObject
+ (NSNull *)null;
@end
3丽已、用處及含義
從定義中可以看出,NSNull是一個Objective-C類买决,只不過這個類相當特殊沛婴,因為它表示的是空值,即什么都不存督赤。它也只有一個單例方法+[NSUll null]嘁灯。該類通常用于在集合對象中保存一個空的占位對象。
4躲舌、示例
我們通常初始化NSArray對象的形式如下:
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil];
當NSArray里遇到nil時丑婿,就說明這個數(shù)組對象的元素截止了,即NSArray只關(guān)注nil之前的對象没卸,nil之后的對象會被拋棄羹奉。比如下面的寫法:
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",nil,@"foogry"];
這是NSArray中只會保存wang和zz兩個字符串,foogry字符串會被拋棄约计。
這種情況诀拭,就可以使用NSNull實現(xiàn)
NSArray *arr = [NSArray arrayWithObjects:@"wang",@"zz",[NSNull null],@"foogry"];
五、總結(jié)
從前面的介紹可以看出病蛉,不管是NULL炫加、nil還是Nil瑰煎,它們本質(zhì)上都是一樣的,都是(void *)0俗孝,只是寫法不同酒甸。這樣做的意義是為了區(qū)分不同的數(shù)據(jù)類型,比如你一看到用到了NULL就知道這是個C指針赋铝,看到nil就知道這是個Objective-C對象插勤,看到Nil就知道這是個Class類型的數(shù)據(jù)。