示例如下:
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型別...