Objective-c nil, Nil, NULL和NSNull的区别
在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别:
| Symbol | Value | Meaning |
|---|---|---|
| NULL | (void *)0 | literal null value for C pointers |
| nil | (id)0 | literal null value for Objective-C objects |
| Nil | (Class)0 | literal null value for Objective-C classes |
| NSNull | [NSNull null] | singleton object used to represent null |
一、nil:对象为空
定义某一实例对象为空值。例如:
- NSObject* obj = nil;
- if (nil == obj) {
- NSLog(@"obj is nil");
- }
- else {
- NSLog(@"obj is not nil");
- }
二、Nil:类为空
定义某一类为空。例如:
- Class someClass = Nil;
- Class anotherClass = [NSString class];
三、NULL:基本数据对象指针为空
用于c语言的各种数据类型的指针为空。例如:
- intint *pointerToInt = NULL;
- charchar *pointerToChar = NULL;
- struct TreeNode *rootNode = NULL;
四、NSNull
集合对象无法包含 nil 作为其具体值,如NSArray、NSSet和NSDictionary。相应地,nil 值用一个特定的对象 NSNull 来表示。NSNull 提供了一个单一实例用于表示对象属性中的的nil值。
- @interface NSNull : NSObject <NSCopying, NSSecureCoding>
- + (NSNull *)null;
- @end
在NSNull单例类中,提供了唯一的方法null:Returns the singleton instance of NSNull.
例如:
- NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
- mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey`
- NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]
五、说明:
Technically they're all the same, but in practice they give someone reading your code some hints about what's going on; just like naming classes with a capital letter and instances with lowercase is recommended, but not required.
If someone sees you passing NULL, they know the receiver expects a C pointer. If they see nil, they know the receiver is expecting an object. If they see Nil, they know the receiver is expecting a class. Readability.
六、注
下面附带几个有趣的例子:
(1)
- NSObject *obj1 = [[NSObject alloc] init];
- NSObject *obj2 = [NSNull null];
- NSObject *obj3 = [NSObject new];
- NSObject *obj4;
- NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];
- NSLog(@"arr1 count: %ld", [arr1 count]); //arr1 count: 3
- NSObject *obj1;
- NSObject *obj2 = [[NSObject alloc] init];
- NSObject *obj3 = [NSNull null];
- NSObject *obj4 = [NSObject new];
- NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil nil];
- NSLog(@"arr2 count: %ld", [arr2 count]); //arr2 count: 0
为啥第一个数组元素有三个,而第二个数组元素为0.先看看:
- NSObject* obj;
- if (nil == obj) {
- NSLog(@"obj is nil");
- }
- else {
- NSLog(@"obj is not nil");
- }
这个输出:obj is nil。而NSArray是以nil结尾的。所以知道原因了吧!
(2)
- //有异常!
- NSObject *obj1 = [NSNull null];
- NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
- for (NSString *str in arr1) {
- NSLog(@"array object: %@", [str lowercaseString]);
- }
- //修改
- NSObject *obj1 = [NSNull null];
- NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1, @"three" ,nil];
- for (NSString *str in arr1) {
- if (![str isEqual:[NSNull null]]){
- NSLog(@"array object: %@", [str lowercaseString]);
- }
- }
Objective-c nil, Nil, NULL和NSNull的区别的更多相关文章
- [BS-22] Objective-C中nil、Nil、NULL、NSNull的区别
Objective-C中nil.Nil.NULL.NSNull的区别 1.定义: nil: OC语言定义:#define nil __DARWIN_NULL / #define __D ...
- iOS 中nil,Nil,NULL,NSNull的区别
类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...
- Objective C语言中nil、Nil、NULL、NSNull的区别
以下内容是基于搜集整理的网上资料,供参考. nil:指向Objective C语言中对象的空指针,其定义值为(id)0. Nil:指向Objective C语言中类(Class)的空指针,其定义值为( ...
- nil、Nil、NULL、NSNull的区别
nil:指向一个对象的空指针,对objective c id 对象赋空值. Nil:指向一个类的空指针,表示对类进行赋空值. NULL:指向其他类型(如:基本类型.C类型)的空指针, 用于对非对象指针 ...
- nil、Nil、NULL和NSNull的区别和联系
一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对 ...
- nil、Nil、NULL与NSNull的区别--备用
我们来分别介绍一下这四种类型: 一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统 ...
- nil、Nil、NULL与NSNull的区别及应用
总结 nil:OC中的对象的空指针 Nil:OC中类的空指针 NULL:C类型的空指针 NSNull:数值类的空对象 详细解析应用如下: 1.nil 指向一个对象的指针为空 在objc.h中的定义 ...
- OC中nil、Nil、NULL、NSNull的区别
nil:指向OC中对象的空指针 e.g.: NSString *string = nil; Nil:指向OC中类的空指针 e.g.:Class class = Nil; NULL:指向其他类型的 ...
- iOS中nil、 Nil、 NULL和NSNull的区别
参考链接:https://www.jianshu.com/p/c3017ae6684a
- 1.import和include区别 2.NSLog 和printf区别 3.创建对象做的事情 4. 类和对象方法比较 5 匿名对象优缺点 6. 封装 7.作用域范围 8.id和instancetype 9.自定义构造方法规范 10.nil和Nil及NULL、NSNull区别
1.import和include的区别: import可以防止头文件的重复包含 2.NSLog 和printf的区别: 1,NSLog可以自动换行, 输出调试信息, printf不能. 2,NSLog ...
随机推荐
- skb管理函数之alloc_skb、dev_alloc_skb、kfree_skb、dev_kfree_skb、consume_skb
alloc_skb--分配skb dev_alloc_skb--分配skb,通常被设备驱动用在中断上下文中,它是alloc_skb的封装函数,因为在中断处理函数中被调用,因此要求原子操作(GFP_AT ...
- VPS L2TP配置
原文地址:https://raymii.org/s/tutorials/IPSEC_L2TP_vpn_with_Ubuntu_14.04.html 只要保证ipsec verify没错,基本都可以成功 ...
- xtraTabControl学习
winform 首先是动态添加page面,并且在page页面上添加一个form窗体 DevExpress.XtraTab.XtraTabPage page = new DevExpress.XtraT ...
- 实现atoi函数
atoi函数最关键的地方是想好测试用例: 输入为空字符串,输出为0; 输入字符串大小超过INT_MAX输出INT_MAX; 输入字符串大小小于INT_MIN输出INT_MIN; 输入字符串中含有不规则 ...
- mysql 安装和配置
mysql 安装: 在命令行输入 sudo apt-get install mysql-server 安装过程中会跳出来一个窗口,输入数据库root用户的密码(必须输入密码) 安装完成后 通过 my ...
- 类似于input输入框placeholder的效果,兼容ie8
$(function(){ //判断浏览器是否支持placeholder属性 supportPlaceholder='placeholder'in document.createElement ...
- 《java并发编程实战》读书笔记9--并发程序的测试
第12章 并发程序的测试 大致分为两类:安全性测试和活跃性测试 12.1 正确性测试 找出需要检查的不变性条件和后验条件.接下来将构建一组测试用例来测试一个有界缓存.程序清单12-1给出了Bounde ...
- Efficient Graph-Based Image Segmentation
转:http://blog.csdn.net/asongoficeandfire/article/details/8434799 Efficient Graph-Based Image Segment ...
- mysql中的制表符替换
-- 问题重现set @v_t=' ';select hex(@v_t) -- 原因: -- ASCII格式的hex进展ox09对应char为(ht)制表tab,喔原来是有很多的制表符吧. ...
- jquery实现页面加载时删除特定class 的div内前三个字符
jQuery(document).ready(function(){ jQuery("div.groupheader").each(function(){ $(thi ...