天天看點

ios nil、NULL和NSNull 的使用

nil用來給對象指派(objective-c中的任何對象都屬于id類型),null則給任何指針指派,null和nil不能互換,nil用于類指針指派(在objective-c中類是一個對象,是類的meta-class的執行個體), 而nsnull則用于集合操作,雖然它們表示的都是空值,但使用的場合完全不同。

id object = nil;  

// 判斷對象不為空  

if (object) {  

}  

// 判斷對象為空  

if (object == nil) {  

// 數組初始化,空值結束  

nsarray *array = [[nsarray alloc] initwithobjects:@"first", @"second", nil];  

// 判斷數組元素是否為空  

nsstring *element = [array objectatindex:2];  

if ((nsnull *)element == [nsnull null]) {  

今天做項目的時候就遇到,要判斷數組元素是否為空,我的以下寫法,都無效

if(!element)

if([element length]>0)

if(element== null)

if(element == nil)

// 判斷字典對象的元素是否為空  

nsdictionary *dictionary = [nsdictionary dictionarywithobjectsandkeys:  

    @"iphone", @"first", @"ipad", @"second", nil];  

nsstring *value = [dictionary objectforkey:@"first"];  

if ((nsnull *)value == [nsnull null]) {  

}  

歡迎大家繼續補充他們的差別。

加深了解一

1、nil:一般指派給空對象;

2、null:一般指派給nil之外的其他空值。如sel等;

  舉個栗子(好重啊~):

    [nsapp beginsheet:sheet

                modalforwindow:mainwindow

                modaldelegate:nil //pointing to an object

                didendselector:null //pointing to a non object/class

                contextinfo:null]; //pointing to a non object/class

3、nsnull:nsnull隻有一個方法:+ (nsnull *) null;

  [nsnull null]用來在nsarray和nsdictionary中加入非nil(表示清單結束)的空值.   [nsnull null]是一個對象,他用在不能使用nil的場合。

4、當向nil發送消息時,傳回no,不會有異常,程式将繼續執行下去;

  而向nsnull的對象發送消息時會收到異常。

因為在nsarray和nsdictionary中nil中有特殊的含義(表示清單結束),是以不能在集合中放入nil值。如要确實需要存儲一個表示“什麼都沒有”的值,可以使用nsnull類。nsnull隻有一個方法:

+ (nsnull *) null;

<code>nil是一個對象指針為空,nil是一個類指針為空,null是基本資料類型為空。這些可以了解為nil,nil, null的差別吧。</code>

加深了解二

淺談關于nil和 null差別及相關問題

1、nil和null從字面意思來了解比較簡單,nil是一個對象,而null是一個值,我的了解為nil是将對象設定為空,而null是将基本類型設定為空的,個人感覺有點像屬性當中,基本類型配置設定為assign nsstring類型一般配置設定copy,而對象一般用retain。而且我們對于nil調用方法,不會産生crash或者抛出異常。

看一段

nil -&gt; null-pointer to objective- c object

nil -&gt; null-pointer to objective- c class

null-&gt; null pointer to primitive type or absence of data.

看一下用法

nsurl *url = nil;

class  class = nil;

int *pointerint = null;

nil是一個對象指針為空,nil是一個類指針為空,null是基本資料類型為空。這些可以了解為nil,nil, null的差別吧。

2、一個可以研究一下的問題

在dealloc中

-(void) dealloc

{

self.test = nil; 

[_test release];

test = nil;

}

這幾個的差別

先說最簡單的  [_test release]; 這個就是将引用技術減1,所謂的引用計數就是看看有多個指針指向一塊記憶體實體,當release一次,就是指針減少一個,release到了0的時候,就是真正把這塊記憶體歸還給系統的時候了

再說self.test = nil;說明一下 屬性和setter和getter方法就不難了解了

-(void) settest:(nsstring *)newstring

if(_test != newstring)

_test = [newstring retain];

-(nsstring *)test

return  _test;

這個是setter和getter方法,而在這個問題中相當于剛才的代碼改變為

if(_test != nil)

_test = nil;

現在就比較容易解釋了,setter方法會retain nil對象,在這之前已經先release了舊的對象,這個方法優點是成員變量連指向随機資料的機會都沒有,而通過别的方式,就可能會出現指向随機資料的情況。當release了之後,萬一有别的方法要用要存取它,如果它已經dealloc了,可能就會crash,而指向nil之後,就不會發生錯誤了。nil說白了就是計數器為0,這麼說吧,當真正release一個對象的時候,nslog是列印不了它指向的記憶體控件的,而當nil的時候,是可以列印出來指向的一個記憶體空間。

那麼現在也不難解釋test = nil;  單純的這種用法可以說是自己給自己制造記憶體洩露,這裡可以這麼了解,就是相當于将指向對象的指針直接和對象一刀兩斷了。直接讓test指向nil,而記憶體實體不會消失,也不會有系統回收。