文档章节

iOS中的(null) <null> nil 问题

Marginx
 Marginx
发布于 2015/10/06 17:02
字数 814
阅读 1843
收藏 1

前段时间开发过程中,界面上莫名其妙的有些地方显示(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


© 著作权归作者所有

Marginx
粉丝 4
博文 17
码字总数 19301
作品 0
深圳
私信 提问
iOS中,对象释放机制以及__weak、__unsafe_unretained的一些问题

iOS中,首先有一点可以确认的,就是weak修饰的,在持有或者引用为0的时候,为自动将对象nil,iOS中对于一个nil发消息是不会发生崩溃等问题的,而unsafeunretained则不然,他不会销毁置为nil,因...

RainOrz
2018/06/26
51
0
jFinal解析IOS post请求获取不到参数问题

以前用struts没发现android和ios请求有什么不同,直接在Controller设置同名属性,设置set方法就ok了,最近想将一些小项目用jfinal实现,发现一个烦人的问题。 web、android上的get请求、pos...

Shydow
2016/10/18
737
2
NS_ASSUME_NONNULL_BEGIN && NS_ASSUME_NONNULL_END

1.NSASSUMENONNULLBEGIN && NSASSUMENONNULLEND 在中存在类型,也就是使用?和!声明的变量。但是OC里面没有这个特征,因为在XCODE6.3之后出现新的关键词定义用于OC转SWIFT时候可以区分到底是...

贝勒老爷
04/24
0
0
NS_ASSUME_NONNULL_BEGIN & NS_ASSUME_NONNULL_END

写在前面的话,很久没写技术文章了。自己一直对于系统的很多语法很好奇,就是系统的宏定义语法,不知道干什么的,今天研究一下,以后可以能继续的追加。错误的地方请大神指正留言,我会尽快的...

贝勒老爷
2018/11/16
0
0
Core Data 学习笔记(二)被管理对象模型

目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三)被管理对象 Core Data 学习笔记 应用示例 Core Data 学习笔记 常用链接整理 三、被...

灰大羊
2015/07/26
202
0

没有更多内容

加载失败,请刷新页面

加载更多

Excel数据透视表基础:数据透视表的正确数据格式

1.数据透视表:是一种数据分析方法, 一.使用数据透视表必须用正确的数据格式: 1.数据必须有标题: 2.数据表不能有相同的标题 3.数据表中不能有合并单元格 4.不能有 小计、合计、空行、分类...

东方墨天
昨天
10
0
聊聊nacos的NacosDiscoveryAutoConfiguration

序 本文主要研究一下nacos的NacosDiscoveryAutoConfiguration NacosDiscoveryAutoConfiguration nacos-spring-boot-project/nacos-discovery-spring-boot-autoconfigure/src/main/java/com/a......

go4it
昨天
10
0
如何保证消息的顺序性?

面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题...

米兜
昨天
18
0
网络安全市场需求

最近,网络安全技能差距的热门话题流传开来。技能差距经常被紧急讨论,可以看出它在实践中的作用是很大的。但信息安全是一门广泛的学科,所以在谈论“技能差距”时需要更具体。有专家表示,真...

linuxCool
昨天
12
0
饿了么快应用初体验

作者:饿了么 顾诚 为什么我们选择了快应用 在很长一段时间里,原生饿了么应用对于新用户来说体验成本略高,对于迫切想要点餐的老用户操作有点繁琐;而 Web 版的饿了么应用在体验、速度、功能...

前端老手
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部