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 的同時最好也...