你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS之iOS中的(null)、<null>、 nil 的問題

iOS之iOS中的(null)、<null>、 nil 的問題

編輯:IOS開發綜合

  摘要: 你有沒有過這樣的經歷,就是界面上顯示出類似<null>、(null)這樣一些東西,有時候還會莫名其妙的閃退。反反復復真是曰了犬,今天來總結一下這個問題的解決方法

前段時間開發過程中,界面上莫名其妙的有些地方顯示(null)有些地方顯示 <null>,修改起來很蛋疼,經過查找資料來總結一下其中的微妙,免得以後再在這個東西上花無謂的時間去修改。

 

首先記錄一下我遇到這類問題的解題思路,最簡單直接的方法是:首先定位到出問題的位置,然後用暴力方式把這個變量打印出來!

打印分兩種:①%p打印地址;②%@打印對象的描述(字符串對象就是其本身)

本文先說結論再展開來講。

總結:0. nil、NULL本質上是相同的,都指向0x0地址,[NSNULL null]是一個對象,存儲在常量區,占用著固定地址。

 1.nil 表示一個指針指向的對象為空,這個對象的類型是id,顯示出來是(null)--->常見於非集合類中

2.[NSNull null] 表示空對象本身,顯示出來是<null> -------------------------->常見於集合類中

         3.NULL 和 nil,沒有實質區別,只不過前者是C語言只中的

下面詳細來講解一下三者區別

============== nil ================

  1. 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 ================

  1. 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 ================

 

  1. NSNULL是一個類,它代表空值

  2. NSNULL只有一個單例方法 [NSNull null]

  3. 用途:用於表示集合值為空的對象(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

 

 

【iOS之iOS中的(null)、&lt;null&gt;、 nil 的問題】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁: