前段時間開發過程當中,界面上莫名其妙的有些地方顯示(null)有些地方顯示 <null>,修改起來很蛋疼,通過查找資料來總結一下其中的微妙,省得之後再在這個東西上花無謂的時間去修改。git
首先記錄一下我遇到這類問題的解題思路,最簡單直接的方法是:首先定位到出問題的位置,而後用暴力方式把這個變量打印出來!github
打印分兩種:①%p打印地址;②%@打印對象的描述(字符串對象就是其自己)objective-c
本文先說結論再展開來說。spa
總結:0. nil、NULL本質上是相同的,都指向0x0地址,[NSNULL null]是一個對象,存儲在常量區,佔用着固定地址。.net
1.nil 表示一個指針指向的對象爲空,這個對象的類型是id,顯示出來是(null)--->常見於非集合類中指針
2.[NSNull null] 表示空對象自己,顯示出來是<null> -------------------------->常見於集合類中
code
3.NULL 和 nil,沒有實質區別,只不過前者是C語言只中的orm
下面詳細來說解一下三者區別對象
============== nil ================blog
nil是OC對象的字面空值 ,這個對象的類型是id.
NSString *str = nil; NSData *data = nil; NSLog(@"%@",nil); NSLog(@"%@",str); NSLog(@"%@",data); NSLog(@"%p",nil); NSLog(@"%p",str); NSLog(@"%p",data); NSLog(@"%d",(data == nil)); 2015-10-06 13:13:45.338 test[95730:5489376] (null) 2015-10-06 13:13:45.338 test[95730:5489376] (null) 2015-10-06 13:13:45.338 test[95730:5489376] (null) 2015-10-06 13:13:45.338 test[95730:5489376] 0x0 2015-10-06 13:13:45.338 test[95730:5489376] 0x0 2015-10-06 13:13:45.338 test[95730:5489376] 0x0 2015-10-06 13:13:45.338 test[95730:5489376] 1
2. 空對象在控制檯打印出來是(null)
3. nil定義
// objc.h #ifndef NULL #define NULL __DARWIN_NULL #endif /* ! NULL */ #ifndef nil #if defined(__has_feature) #if __has_feature(cxx_nullptr) #define nil nullptr #else #define nil __DARWIN_NULL #endif #else #define nil __DARWIN_NULL #endif #endif // __DARWIN_NULL in _types.h #define __DARWIN_NULL ((void *)0)
===========NULL ================
NULL是任意的C指針空值
int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL; NSLog(@"%@",pointerToInt); NSLog(@"%s",pointerToChar); NSLog(@"%@",rootNode); NSLog(@"%d",pointerToInt==NULL); // NSLog(@"%d",pointerToInt==nil); // 2015-10-06 13:38:59.927 test[95925:5515192] (null) 2015-10-06 13:38:59.927 test[95925:5515192] (null) 2015-10-06 13:38:59.927 test[95925:5515192] (null) 2015-10-06 13:38:59.927 test[95925:5515192] 1 2015-10-06 13:38:59.927 test[95925:5515192] 1
2. 控制檯打印出來是(null)
3. 定義
#ifndef NULL #define NULL __DARWIN_NULL #endif /* ! NULL */
===========NSNULL ================
NSNULL是一個類,它表明空值
NSNULL只有一個單例方法 [NSNull null]
用途:用於表示集合值爲空的對象(oc中nil是不能存放在集合中的,由於nil是集合結束的標誌位)
NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",[NSNull null], nil]; for (NSString *str in arr) { NSLog(@"%@",str); } 2015-10-06 16:40:25.816 test[96177:5565855] one 2015-10-06 16:40:25.817 test[96177:5565855] two 2015-10-06 16:40:25.817 test[96177:5565855] <null>
4. 此時控制檯打印出來的是<null>
5. 定義
/* NSNull.h Copyright (c) 1994-2015, Apple Inc. All rights reserved. */ #import <Foundation/NSObject.h> NS_ASSUME_NONNULL_BEGIN @interface NSNull : NSObject <NSCopying, NSSecureCoding> + (NSNull *)null; @end NS_ASSUME_NONNULL_END
參考資料:http://stackoverflow.com/questions/5908936/difference-between-nil-nil-and-null-in-objective-c
http://blog.csdn.net/shenshen123jun/article/details/38315755
https://github.com/nicklockwood/NullSafe