nil,Nil,null,NSNULL的區別與用法

2021-06-28 11:09:24 字數 3270 閱讀 3046

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等;

舉個栗子(好重啊~):

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;

nil是乙個物件指標為空,nil是乙個類指標為空,null是基本資料型別為空。這些可以理解為nil,nil, null的區別吧。

加深理解二

**關於nil和 null區別及相關問題

1、nil和null從字面意思來理解比較簡單,nil是乙個物件,而null是乙個值,我的理解為nil是將物件設定為空,而null是將基本型別設定為空的,個人感覺有點像屬性當中,基本型別分配為assign nsstring型別一般分配copy,而物件一般用retain。而且我們對於nil呼叫方法,不會產生crash或者丟擲異常。

看一段nil -> null-pointer to objective- c object

nil -> null-pointer to objective- c class

null-> 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

這幾個的區別

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

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

-(void) settest:(nsstring *)newstring

-(nsstring *)test

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

if(_test != nil)

[_test release];

_test = nil;

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

那麼現在也不難解釋test = nil;  單純的這種用法可以說是自己給自己製造記憶體洩露,這裡可以這麼理解,就是相當於將指向物件的指標直接和物件一刀兩斷了。直接讓test指向nil,而記憶體實體不會消失,也不會有系統**。

加深理解三

nil:指向oc中物件的空指標

nil:指向oc中類的空指標

null:指向其他型別的空指標,如乙個c型別的記憶體指標

nsnull:在集合物件中,表示空值的物件

若obj為nil:

[obj message]將返回no,而不是n***ception

若obj為nsnull:

[obj message]將丟擲異常n***ception

nil,Nil,null,NSNULL的區別與用法

1 nil 一般賦值給空物件 2 null 一般賦值給nil之外的其他空值。如sel等 modaldelegate nil pointing to an object didendselector null pointing to a non object class contextinfo nul...

nil Nil NULL NSNull 之間的區別

nil 是對objective c id 物件賦空值 例如 nsstring string nsstring stringwithformat test string nil 對於objective c 集合類物件 比如陣列物件,字典物件,當我們不需要再使用他們的時候,對他們release 的同時最...

nil Nil NULL NSNull 之間的區別

nil 是對objective c id 物件賦空值 例如nsstring string nsstringstringwithformat test string nil 對於objective c 集合類物件 比如陣列物件,字典物件,當我們不需要再使用他們的時候,對他們release 的同時最好也...