摘要: 你有没有过这样的经历,就是界面上显示出类似<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. java.util.Collections.unmodifiableMap 示例

    1. 概述 public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) ...

  2. 基于svg.js实现对图形的拖拽、选择和编辑操作

    本文主要记录如何使用 svg.js 实现对图形的拖拽,选择,图像渲染及各类形状的绘制操作. 1.关于SVG SVG 是可缩放的矢量图形,使用XML格式定义图像,可以生成对应的DOM节点,便于对单个图形 ...

  3. 前端之body标签中相关标签(一)

    一 字体标签   字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub& ...

  4. sass判断语句

    @if判断 @if可一个条件单独使用,也可以和@else结合多条件使用 scss.style css.style 三目判断 语法为:if($condition, $if_true, $if_false ...

  5. jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件

    jQuery框架学习第一天:开始认识jQueryjQuery框架学习第二天:jQuery中万能的选择器jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQuer ...

  6. Spring 框架(三)

    1 spring l AOP :切面编程 切面:切入点 和 通知 结合 l spring aop 编程 <aop:config> 方法1: <aop:pointcut express ...

  7. jQuery和css3控制箭头丝滑旋转

    问题: 我们经常会遇见点击一个小三角使之丝滑的旋转180度上下旋转,怎么实现呢,需要css3搭配jq 来处理 如图:1.点击前 2.点击后(效果丝滑旋转)                 1.html ...

  8. Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网)

    Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网) 上一篇介绍了利用CookieJar访问人人网,本篇将使用filecookiejar将cookie以文件形式 ...

  9. 升级CocoaPod遇到ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String问题的解决方法

    如下图: 先执行命令: gem update --system 再升级: sudo gem install cocoapods --pre 这样就能够正常升级了.

  10. Sql Server 如何去掉内容里面的Html标签

    DECLARE @str NVARCHAR(MAX)= ' <!DOCTYPE html> <html> <head> </head> <body ...