nil Nil NULL和NSNull的理解

2022-09-16 03:33:10 字數 1489 閱讀 7883

其實早就想研究一下nil、nil、null和nsnull之間的區別,只是工作上除了nil,其它的幾乎少有用到,所以一直拖到今天。有時候感覺自己越來越浮躁,對細微處的知識理解不夠深入,因此這裡給自己提個醒--在以後的工作當中要始終保持一種鑽研的精神!

言歸正傳,我們來分別介紹一下這四種型別:

一、nil

我們給物件賦值時一般會使用object = nil,表示我想把這個物件釋放掉;

或者物件由於某種原因,經過多次release,於是物件引用計數器為0了,系統將這塊記憶體釋放掉,這個時候這個物件為nil,我稱它為「空物件」。(注意:我這裡強調的是「空物件」,下面我會拿它和「值為空的物件」作對比!!!)

二、nsnull

nsnull和nil的區別在於,nil是乙個空物件,已經完全從記憶體中消失了,而如果我們想表達「我們需要有這樣乙個容器,但這個容器裡什麼也沒有」的觀念時,我們就用到nsnull,我稱它為「值為空的物件」。如果你查閱開發文件你會發現nsnull這個類是繼承nsobject,並且只有乙個「+ (nsnull *) null;」類方法。這就說明nsnull物件擁有乙個有效的記憶體位址,所以在程式中對它的任何引用都是不會導致程式崩潰的。參考**如下:

三、nil

nil和nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用nil來代替,反之亦然。只不過從程式設計人員的規約中我們約定俗成地將nil表示乙個空物件,nil表示乙個空類。參考**如下:

四、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);

nil Nil NULL和NSNull的理解

其實早就想研究一下nil nil null和nsnull之間的區別,只是工作上除了nil,其它的幾乎少有用到,所以一直拖到今天。有時候感覺自己越來越浮躁,對細微處的知識理解不夠深入,因此這裡給自己提個醒 在以後的工作當中要始終保持一種鑽研的精神!言歸正傳,我們來分別介紹一下這四種型別 一 nil 我...

IOS中類和物件以及nil Nil NULL的區別

類是對同一類事物高度的抽象,類中定義了這一類物件所應具有的靜態屬性 屬性 和動態屬性 方法 物件 是類的乙個例項,是乙個具體的事物。類與物件是抽象與具體的關係。類其實就是一種資料型別,它的變數就是物件。類與類之間的關係 繼承關係 a是b如果這句話說的通,在設計程式的時候就可以看成是繼承關係。例如 學...

nil Nil NULL與NSNull的區別

1.nil 指向乙個物件的指標為空 在objc.h中的定義如下所示 ifndef nil if has feature cxx nullptr define nil nullptr else define nil darwin null endif endif 在objective c中用於id型別...