iOS之iOS中的(null)、<null>、 nil 的问题
前段时间开发过程中,界面上莫名其妙的有些地方显示(null)有些地方显示 <null>,修改起来很蛋疼,经过查找资料来总结一下其中的微妙,免得以后再在这个东西上花无谓的时间去修改。
首先记录一下我遇到这类问题的解题思路,最简单直接的方法是:首先定位到出问题的位置,然后用暴力方式把这个变量打印出来!
打印分两种:①%p打印地址;②%@打印对象的描述(字符串对象就是其本身)
本文先说结论再展开来讲。
总结:0. nil、NULL本质上是相同的,都指向0x0地址,[NSNULL null]是一个对象,存储在常量区,占用着固定地址。
1.nil 表示一个指针指向的对象为空,这个对象的类型是id,显示出来是(null)--->常见于非集合类中
2.[NSNull null] 表示空对象本身,显示出来是<null> -------------------------->常见于集合类中
3.NULL 和 nil,没有实质区别,只不过前者是C语言只中的
下面详细来讲解一下三者区别
============== nil ================
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 ================
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 ================
NSNULL是一个类,它代表空值
NSNULL只有一个单例方法 [NSNull null]
用途:用于表示集合值为空的对象(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 的问题的更多相关文章
- Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
本文由我们团队的 康祖彬 童鞋撰写,这是他的个人主页:https://kangzubin.cn. 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居 ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- unity导出工程导入到iOS原生工程中详细步骤
一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- iOS: 消息通信中的Notification&KVO
iOS: 消息通信中的Notification&KVO 在 iOS: MVC 中,我贴了张经典图: 其中的Model向Controller通信的Noification&KVO为何物呢? ...
- iOS 处理方法中的可变參数
## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录 ...
- ios逆向过程中lldb调试技巧
在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f 看看各个模块在内存中的基址 2.register read r0 读取寄存器r0的 ...
- scala(一)Nothing、Null、Unit、None 、null 、Nil理解
相对于java的类型系统,scala无疑要复杂的多!也正是这复杂多变的类型系统才让OOP和FP完美的融合在了一起! Nothing: 如果直接在scala-library中搜索Nothing的话是找不 ...
- iOS - 选取相册中iCloud云上图片和视频的处理
关于iOS选取相册中iCloud云上图片和视频 推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...
随机推荐
- java.util.Collections.unmodifiableMap 示例
1. 概述 public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) ...
- 基于svg.js实现对图形的拖拽、选择和编辑操作
本文主要记录如何使用 svg.js 实现对图形的拖拽,选择,图像渲染及各类形状的绘制操作. 1.关于SVG SVG 是可缩放的矢量图形,使用XML格式定义图像,可以生成对应的DOM节点,便于对单个图形 ...
- 前端之body标签中相关标签(一)
一 字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub& ...
- sass判断语句
@if判断 @if可一个条件单独使用,也可以和@else结合多条件使用 scss.style css.style 三目判断 语法为:if($condition, $if_true, $if_false ...
- jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件
jQuery框架学习第一天:开始认识jQueryjQuery框架学习第二天:jQuery中万能的选择器jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQuer ...
- Spring 框架(三)
1 spring l AOP :切面编程 切面:切入点 和 通知 结合 l spring aop 编程 <aop:config> 方法1: <aop:pointcut express ...
- jQuery和css3控制箭头丝滑旋转
问题: 我们经常会遇见点击一个小三角使之丝滑的旋转180度上下旋转,怎么实现呢,需要css3搭配jq 来处理 如图:1.点击前 2.点击后(效果丝滑旋转) 1.html ...
- Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网)
Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网) 上一篇介绍了利用CookieJar访问人人网,本篇将使用filecookiejar将cookie以文件形式 ...
- 升级CocoaPod遇到ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String问题的解决方法
如下图: 先执行命令: gem update --system 再升级: sudo gem install cocoapods --pre 这样就能够正常升级了.
- Sql Server 如何去掉内容里面的Html标签
DECLARE @str NVARCHAR(MAX)= ' <!DOCTYPE html> <html> <head> </head> <body ...