其實早就想研究一下nil、Nil、NULL和NSNull之間的區別,只是工作上除了nil,其它的幾乎少有用到,所以一直拖到今天。有時候感覺自己越來越浮躁,對細微處的知識理解不夠深入,因此這里給自己提個醒--在以后的工作當中要始終保持一種鑽研的精神!
言歸正傳,我們來分別介紹一下這四種類型:
一、nil
我們給對象賦值時一般會使用object = nil,表示我想把這個對象釋放掉;
或者對象由於某種原因,經過多次release,於是對象引用計數器為0了,系統將這塊內存釋放掉,這個時候這個對象為nil,我稱它為“空對象”。(注意:我這里強調的是“空對象”,下面我會拿它和“值為空的對象”作對比!!!)
所以對於這種空對象,所有關於retain的操作都會引起程序崩潰,例如字典添加鍵值或數組添加新原素等,具體可參考如下代碼:
二、NSNull
NSNull和nil的區別在於,nil是一個空對象,已經完全從內存中消失了,而如果我們想表達“我們需要有這樣一個容器,但這個容器里什么也沒有”的觀念時,我們就用到NSNull,我稱它為“值為空的對象”。如果你查閱開發文檔你會發現NSNull這個類是繼承NSObject,並且只有一個“+ (NSNull *) null;”類方法。這就說明NSNull對象擁有一個有效的內存地址,所以在程序中對它的任何引用都是不會導致程序崩潰的。參考代碼如下:
三、Nil
nil和Nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用Nil來代替,反之亦然。只不過從編程人員的規約中我們約定俗成地將nil表示一個空對象,Nil表示一個空類。參考代碼如下:
四、NULL
我們知道Object-C來源於C、支持於C,當然也有別於C。而NULL就是典型C語言的語法,它表示一個空指針,參考代碼如下:
int *ponit = NULL;
NSString *ss = nil;
if (nil == ss) {
NSLog(@" nil --> (null) --> %@",ss);
}
// NSNull是個單例,只有一個方法null,也用來表示空值。但它出現在一些nil無法勝任的場景來替代nil來表示空值。比如NSArray和NSDictionary中nil代表數組或字典的末尾(即使nil不出現在末尾,也會將其切斷,nil后面的值會丟失),此時只能用NSNull對象來表示空值:
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = @[nullValue];
NSLog(@" arrayWithNull: %@", arrayWithNull);
NSString *s = @"";
if ([s isEqual:[NSNull null]]) {
NSLog(@" == %@", ss);
}