nil、Nil、NULL、NSNull之间的区别
2016-05-12 19:20
561 查看
nil、Nil、NULL、NSNull之间的区别
nil的含义
指向一个对象的指针为空,用于给对象指针赋值为空,防止野指针的产生;也称nil为空对象:表示一个已经被释放了的对象,和值为空的对象(NSNull)不同。NSNull是一个对象,只不过这个对象的值为空#ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
给对象指针赋值为空:
NSString * name = nil; NSString * url = nil; id object = nil;
Nil的含义
指向一个类的指针为空,用于给类对象指针赋值为空#ifndef Nil # if __has_feature(cxx_nullptr) # define Nil nullptr # else # define Nil __DARWIN_NULL # endif #endif
给类对象赋值为空:
Class class = Nil;
NULL的含义
指向C类型的指针,用于给C类型的指针赋值为空#if defined(__need_NULL) #undef NULL #ifdef __cplusplus # if !defined(__MINGW32__) && !defined(_MSC_VER) # define NULL __null # else # define NULL 0 # endif #else # define NULL ((void*)0) #endif
给C类型指针赋值:
int * a = NULL; char * ch = NULL; struct aStruct = NULL;
NSNull的含义
NSNull是一个类,其继承自NSObject,只拥有一个类方法。实例对象表示这是一个内容为空的对象。主要用于数组、字典。NSMutableArray * mArray = [NSMutableArray array]; [mArray addObject:[NSNull null]]; NSLog(@"%@", [mArray firstObject]); // 输出为:<null> NSMutableDictionary * dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNull null] forKey:@"null"]; NSLog(@"%@", dict[@"null"]); // 输出为:<null>
由此可见,可用NSNull的实例对象在数组、字典中占位,其所占有的位置为空。
nil、Nil、NULL的使用对比
先看下面做的一个实验:NSArray * array = [NSArray arrayWithObjects:@"good", @"morning", nil]; // array = nil; // 输出:0 // array = NULL; // 输出:0 // array = Nil; // 输出:0 NSLog(@"%ld", array.count); // 分别使用上面三句注释的语句,输出值无区别 Class class = [NSURL class]; // class = Nil; // 输出:(null) // class = nil; // 输出:(null) // class = NULL; // 输出:(null) NSLog(@"%@", class); // 分别使用上面三句注释的语句,输出值无区别 int a = 10; int * p = &a; // p = NULL; // 输出:0x0 // p = nil; // 输出:0x0 // p = Nil; // 输出:0x0 NSLog(@"%p", p); // 分别使用上面三句注释的语句,输出值无区别
结论:
1> nil、Nil、NULL在使用上是没有什么区别的,但是程序员的一个约定:C结构的指针使用NULL;对象指针使用nil;类对象指针使用Nil。
2> 另外NSNull和nil、Nil、NULL具有本质上的区别。NSNull是一个对象,而nil、Nil、NULL只是给指针赋空值。
3> 在另外,给一个赋值为nil的对象发送消息,不会产生异常。当然给一个赋值为Nil、NULL的对象发送消息也不会产生异常,这个在例子中已经证实。故根据此条结论的总结为:nil、Nil、NULL目的都是给一个指针赋值为空,给空指针发送消息不会产生异常
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- mysql 中存在null和空时创建唯一索引的方法
- C#中string.Empty和null的区别详解
- 基于不要返回null之EmptyFactory的应用详解
- c# 所有类型都从Object类型派生
- 详解MySQL中的NULL值
- asp提示无效使用 Null: Replace
- C# Dynamic关键字之:解析dynamic就是Object
- sql 语句中的 NULL值
- 什么是DAO Database Access Object
- JavaScript中为什么null==0为false而null大于=0为true(个人研究)
- 浅谈Javascript中Object与Function对象
- swtich/if...else的替代语句
- JavaScript的null和undefined区别示例介绍
- JavaScript中的object转换成number或string规则介绍
- JavaScript中Object和Function的关系小结
- 深入理解JavaScript系列(12) 变量对象(Variable Object)
- 浅谈JavaScript中null和undefined
- JavaScript Undefined,Null类型和NaN值区别
- 三种单例模式与Object祖先类