摘要: 你有没有过这样的经历,就是界面上显示出类似<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)、<null>、 nil 的问题的更多相关文章

  1. Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同

    本文由我们团队的 康祖彬 童鞋撰写,这是他的个人主页:https://kangzubin.cn. 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居 ...

  2. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  3. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  4. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

  5. iOS: 消息通信中的Notification&KVO

    iOS: 消息通信中的Notification&KVO 在 iOS: MVC 中,我贴了张经典图: 其中的Model向Controller通信的Noification&KVO为何物呢? ...

  6. iOS 处理方法中的可变參数

    ## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录 ...

  7. ios逆向过程中lldb调试技巧

    在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f  看看各个模块在内存中的基址 2.register read r0  读取寄存器r0的 ...

  8. scala(一)Nothing、Null、Unit、None 、null 、Nil理解

    相对于java的类型系统,scala无疑要复杂的多!也正是这复杂多变的类型系统才让OOP和FP完美的融合在了一起! Nothing: 如果直接在scala-library中搜索Nothing的话是找不 ...

  9. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

随机推荐

  1. UOJ#288:基础数据结构练习题

    题面 UOJ Sol 玄学,不会势能分析 所以 维护区间最大最小值 把开根变成区间减法 如果最大值开根后的变化量和最小值的相等,就直接打个减法\(lazy\) # include <bits/s ...

  2. vscode 快速生成html

    在Hbuilder中新建一个htm自动会生成一个标准的html代码,那在vscode得一行一行写吗?太烦了吧,各种关键词搜,哎妈 终于找到了办法,现在这里记录下: 第一步:在空文档中输入   ! 第二 ...

  3. DB DBS 和DBMS区别

    DB:是指datebase(数据库)  DBS:是指datebase systerm (数据库系统)  DBMS:是指datebase mangement systerm(数据库管理系统)区别:数据库 ...

  4. 查看postgre都有哪些语句占用CPU

    查看占用CPU最多的几个postgresql ps aux | grep postgres | sort -n -r -k 3 | head -10 | awk '{print $2, $3}' 查看 ...

  5. 关于建立Android工程R文件丢失的问题

    今天开始学习Android了,好久没打开eclipse,建立Android工程老是报错,于是手残的把appcompat-v7给删了,然后建立工程以后重新出来的appcompat-v7有个小叉号,百度了 ...

  6. linux(centos、ubuntu)网卡配置文件不生效

    今天遇到个问题,服务器上ifcfg配置了eth0文件,但是通过ifcfg命令检查发现网卡IP配置并未生效. 然后通过如下配置修正: ubuntu: # vim /etc/default/grub在”G ...

  7. 初窥IM通信协议

    即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议. 前者是以数据流的形式,将传输数 ...

  8. [BJOI2018]治疗之雨

    题目 我还没疯 发现如果我们将血量抽象成点,一轮操作抽象成图上的一条边,我们如果能求出每一条边的概率,我们就能搞一下这道题 假设我们求出了这个图\(E\),设\(dp_i\)表示从\(i\)点到达\( ...

  9. 【[SHOI2015]脑洞治疗仪】

    我太sb啦 合并的时候又漏了,又漏了,又漏了 我个sb 这是个板子题,并不知道为什么SHOI2015会考这么板子的题,但是我又sb了,又sb了,又sb了,又没有1A 显然我是凉了 这道题有三个操作 区 ...

  10. Codeforces Round #538 (Div. 2) D. Flood Fill 【区间dp || LPS (最长回文序列)】

    任意门:http://codeforces.com/contest/1114/problem/D D. Flood Fill time limit per test 2 seconds memory ...