iOS中 nil Nil NULL 的區別

2022-08-03 12:18:14 字數 3039 閱讀 7735

示例如下:

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

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 release];

_test = [newstring retain];

-(nsstring *)test

return  _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,而記憶體實體不會消失,也不會有系統**。

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

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

nil Nil NULL和NSNull的理解

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

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型別...