理解空的概念就像是把一個實實在在的東西從哲學(xué)的角度去進行理解。
在objective-c中,空分為幾個種類。在C語言中,對于基本數(shù)據(jù)類型來說,空用0表示,而對于指針變量而言,空用NULL表示(相當(dāng)于指針中的0)。objective-c在C的表示基礎(chǔ)上增加了nil。nil是一個指向空的指針變量。雖然在語義上與NULL不同,但是它們在技術(shù)上兩者是相等的。
在框架層,F(xiàn)oundation框架定義了NSNull類,同時定義了+null類方法,并且返回一個NSNull單例對象。NSNull與nil和NULL的不同之處在于它是一個實體對象,而不是零值。另外,在Foundation/NSObjCRuntime.h中,Nil被定義為一個指向空的類指針,但是它并不像nil那樣經(jīng)常出現(xiàn)。
nil
新創(chuàng)建的對象以設(shè)置它們的初始值為0而開始它們的生命周期。這句話的意思就是所有的指針?biāo)赶虻膶ο蟮某跏贾刀际莕il,因此,沒有必要在初始化方法中將對象的初始值設(shè)為nil。
對于nil而言,最引人關(guān)注的特性就是別的對象可以給它發(fā)送消息。在別的語言中,例如C++,這樣做就會引起程序的崩潰,但是在objective-c中,它會觸發(fā)nil的一個方法而返回一個空值。這大大簡化了代碼的結(jié)構(gòu),因為它避免了在做任何事情之前都要檢查它是否是nil的需要:
我們要理解nil如何在objective-c中運作的而給我們帶來了便利,而不是我們程序中潛在的bug。同時我們也要通過檢查代碼或者是添加NSParameterAssert來拋出異常來確保知道哪些情況下nil不是我們所想要的值。
NSNull
NSNull在Foundation和其它框架中被廣泛的使用,以解決如NSArray和NSDictionary之類的集合不能有nil值的缺陷。你可以將NSNull理解為有效的將NULL或者nil值封裝boxing,以達到在集合中使用它們的目的:
總的來說,這里的四個表達空的值是每個Objective-C程序員都應(yīng)該知道的: