博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的(null) <null> nil 问题
阅读量:6033 次
发布时间:2019-06-20

本文共 2742 字,大约阅读时间需要 9 分钟。

hot3.png

前段时间开发过程中,界面上莫名其妙的有些地方显示(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] 0x02015-10-06 13:13:45.338 test[95730:5489376] 0x02015-10-06 13:13:45.338 test[95730:5489376] 0x02015-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] 12015-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] one2015-10-06 16:40:25.817 test[96177:5565855] two2015-10-06 16:40:25.817 test[96177:5565855] 

 4. 此时控制台打印出来的是<null>

5. 定义

/*	NSNull.h	Copyright (c) 1994-2015, Apple Inc. All rights reserved.*/#import 
NS_ASSUME_NONNULL_BEGIN@interface NSNull : NSObject 
+ (NSNull *)null;@endNS_ASSUME_NONNULL_END

参考资料:

            

             https://github.com/nicklockwood/NullSafe

转载于:https://my.oschina.net/shoutan/blog/513764

你可能感兴趣的文章