IOS 空值 nil Nil NULL NSNull kCFNull

先來看個stackOverflow上的例子:

if (nameTextField.text != (id)[NSNull null] || nameTextField.text.length != 0 ) {
    NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@", txtName.text]; 
    [lblMessage setText:msg];
}

結(jié)果:無論nameTextField.text 是否為空,都會進(jìn)入到if 條件句中。
錯誤在: nameTextField.text 如果為空米母,那么它 ==nil 而不是 (id)(NSNull null),所以無論如何,nameTextFiled != (id)[NSNull null] 都是true


我們先來看下這些空值的定義:

nil:  Defines the id of a null instance,指向一個(實例)對象的空指針 
例如:
NSString *msg = nil;
NSDate *date =nil;
Nil: Defines the id of a null class,指向一個類的空指針
例如:
Class class = Nil;
NULL:定義其他類型(基本類型腐巢、C類型)的空指針
char *p = NULL;
NSNull:數(shù)組中元素的占位符,數(shù)據(jù)中的元素不能為nil(可以為空玄括,也就是NSNull)冯丙,
原因:nil 是數(shù)組的結(jié)束標(biāo)志
如果用nil,就會變成
NSArray *array = [NSArray arrayWithObjects:
[[NSObject alloc] init], 
nil,
[[NSObject alloc] init], 
[[NSObject alloc] init], 
nil];遭京,
那么數(shù)組到第二個位置就會結(jié)束胃惜。打印[array count]的話會顯示1而不是5
kCFNull: NSNull的單例
CoreFoundation 中有一段對 kCFNull的定義,實際上就是 NSNull 的單例
typedef const struct CF_BRIDGED_TYPE(NSNull) __CFNull * CFNullRef;

CF_EXPORT
CFTypeID CFNullGetTypeID(void);

CF_EXPORT
const CFNullRef kCFNull; // the singleton null instance

NSNull *null1 = (id)kCFNull;
NSNull *null2 = [NSNull null];

Talking is cheap ,show me the code!

NSLog(@"nil is %p",nil);
NSLog(@"Nil is %p",Nil);
NSLog(@"Null is %p",NULL);
NSLog(@"nil is %@",nil);
NSLog(@"NSNULL is  %@",kCFNull);

nil is 0x0**
Nil is 0x0**
Null is 0x0**
nil is (null)**
NSNULL is  <null>**

主要的區(qū)別就在 nil 系 和 NSNull系 的區(qū)別

nil : 作為對象的空指針和數(shù)組的結(jié)束標(biāo)志
NSNull:作為數(shù)組中的空值占位符


寫這篇文章我修改了好多次哪雕,隨著學(xué)習(xí)的深入船殉,有些早期的認(rèn)識是錯誤的八购俊?繁埂!!
例如這段代碼

    Class class = nil;
    Class class1 = Nil;
    char *p =nil;
    char *p1 = NULL;
    NSString *str = NULL;
    NSLog(@"nil is : %d",class==nil);
    NSLog(@"nil is : %d",class==Nil);
    NSLog(@"Nil is : %d",class1==nil);
    NSLog(@"Nil is : %d",class1==Nil);
    NSLog(@"integer is nil : %d",num == nil);
    NSLog(@"integer is NULL : %d",num == NULL);
    NSLog(@"integer is Nil : %d",num == Nil);
    NSLog(@"nil equals Nil: %d",nil == Nil);
    NSLog(@"Nil equals NULL:%d",p == p1);
    NSLog(@"nil equals NULL: %d",nil == NULL);
結(jié)果全是1柒爵,所以這樣看法瑟,本質(zhì)上 nil , Nil 和 NULL 是一樣的
-->聰明的你能發(fā)現(xiàn)上面的錯誤碼窝剖???
看下下面這段說明
In Objective-C, it's important that you distinguish between objects and primitive types.
An **object** is always stored as a pointer, which is the object's location in memory. A pointer is just a number. With NSLog, you can use %p to see this value. You can display it in the debugger too, like this: print myObject. A pointer is displayed as a hexadecimal number, with a 0x
 prefix. nil is essentially location zero (0x0000). When you allocate any kind of object, you'll get a pointer which isn't zero. When you assign an object to a variable, you are simply copying the memory address, not duplicating the object. With NSLog, you can use %@ to print out an object's description
. In the debugger, like this: print-object myObject
.
**Primitive types** like NSInteger
 aren't objects. Instead of storing a pointer, usually you just store the value. When you assign an NSInteger
 variable, you make a copy of the value. You can see the value in the debugger using print
. Or like this: NSLog("%ld", (long)currentRow)
. When you assign a primitive, you copy its value. Don't use %@
 or print-object
 with primitives — they expect objects.

參考:
1.http://blog.sina.com.cn/s/blog_5fb39f910101akm1.html
2.http://xiongzenghuidegithub.github.io/blog/2014/02/23/nil-nsnull-null-kcfnull/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炉峰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疯攒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴浙,死亡現(xiàn)場離奇詭異砂吞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崎溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜻直,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事概而『粝铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵赎瑰,是天一觀的道長王悍。 經(jīng)常有香客問我,道長餐曼,這世上最難降的妖魔是什么压储? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮源譬,結(jié)果婚禮上渠脉,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶佳,他們只是感情好芋膘,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霸饲,像睡著了一般为朋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厚脉,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天习寸,我揣著相機(jī)與錄音,去河邊找鬼傻工。 笑死霞溪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的中捆。 我是一名探鬼主播鸯匹,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泄伪!你這毒婦竟也來了殴蓬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蟋滴,失蹤者是張志新(化名)和其女友劉穎染厅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體津函,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡肖粮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尔苦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩馆。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡行施,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凌净,到底是詐尸還是另有隱情,我是刑警寧澤屋讶,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布冰寻,位于F島的核電站,受9級特大地震影響皿渗,放射性物質(zhì)發(fā)生泄漏斩芭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一乐疆、第九天 我趴在偏房一處隱蔽的房頂上張望划乖。 院中可真熱鬧,春花似錦挤土、人聲如沸琴庵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迷殿。三九已至,卻和暖如春咖杂,著一層夾襖步出監(jiān)牢的瞬間庆寺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工诉字, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留懦尝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓壤圃,卻偏偏與公主長得像陵霉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伍绳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容