iOS中的(null) <null> nil 问题
2015-10-06 17:02
459 查看
前段时间开发过程中,界面上莫名其妙的有些地方显示(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.
2. 空对象在控制台打印出来是(null)
3. nil定义
===========NULL ================
NULL是任意的C指针空值
2. 控制台打印出来是(null)
3. 定义
===========NSNULL ================
NSNULL是一个类,它代表空值
NSNULL只有一个单例方法 [NSNull null]
用途:用于表示集合值为空的对象(oc中nil是不能存放在集合中的,因为nil是集合结束的标志位)
4. 此时控制台打印出来的是<null>
5. 定义
参考资料:http://stackoverflow.com/questions/5908936/difference-between-nil-nil-and-null-in-objective-c
/detail/2617784782.html https://github.com/nicklockwood/NullSafe
首先记录一下我遇到这类问题的解题思路,最简单直接的方法是:首先定位到出问题的位置,然后用暴力方式把这个变量打印出来!
打印分两种:①%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
/detail/2617784782.html https://github.com/nicklockwood/NullSafe
相关文章推荐
- 关于ios9中得ALAssetsLibrary框架过时问题
- iOS开发小项目之找色块游戏
- 关于ios8中CMStepCounter过时的问题
- 升级IOS9错误解决方案:Unexpected CFBundleExecutable Key.The bundle atXXXX
- iOS开发之 简易随机点名册的设计
- ios程序后台运行时,当有消息推送过来,如何修改程序角标上是数字
- iOS 自制汤姆猫
- iOS软件开发 如何做一个选择器
- 关于iOS9适配中出现的问题
- iOS中的动画总体预览
- iOS数据的持久化(沙盒)
- Xcode 7.0过后,也就是iOS9.0过后适配时出现的问题
- HTML5-IOS WEB APP应用程序(IOS META)
- iOS开发如何让透明View里的对象不透明
- [iOS进阶]自己动手写KVO总结
- 你所知道好玩有趣的 iOS URL schemes 有哪些?
- iOS去掉字符串中的空格,换行符号
- 近期苹果公司iOS 9系统策略更新
- iOS开发----三目运算符
- iOS:多线程的详细介绍