[swift、oc]浅聊nil、Nil、NULL、NSNull的区别

我们都知道nil、Nil、NULL、NSNull都表示为空但是究竟有什么区别,相信大家也很少关注。今天我们就浅聊一下这几个空的区别

1、nil

  nil一般是指把一个对象置空,既完全是一个空对象,完全从内存中释放。  

2、Nil

  Nil和nil基本没有任何区别,也可以说只要是可以使用nil的地方都可以使用Nil,反之亦然。但是作为程序猿,我们应该更加严谨一些。nil和Nil的区别在于,nil表示置空一个对象,二Nil表示置空一个类。

3、NULL

  大家都知道oc 是基于c的,并且oc是完全兼容c的,NULL源于c,表示一个空指针.

  既:int *p  = NULL

4、NSNull

  NSNull很有意思,大家一般都会觉得,NSNull也是空,但是看着这货又是“NS”开头的很像一个对象,实质上NSNull的确是一个对象,他继承于NSObject。那它和nil的区别在哪里呢?nil是把一对象完全释放,就是完全从内存中释放。但是当我想把一个对象置空但是又想要一个容器的时候,我们就可以使用NSNull。比如一瓶矿泉水,我们不想要里面的水,但是我们想保留瓶子一样。看一下代码的区别

    swift:

        //  定义一个数组

        let mutableArray = NSMutableArray()

        // 定义一个字典

        let mutableDictionary = NSMutableDictionary()

        // 定义NSNull

        let null = NSNull()

        // 添加到数组

        mutableArray.addObject(null)

        // 添加到字典

        mutableDictionary.setObject(null, forKey: "null")

//***添加NSNull 程序运行很正常,因为 NSNull是一个类有内存地址的,所以添加到字典和数组都不会崩。下面是一下nil

        // 添加nil到数组

        mutableArray.addObject(nil)

        // 添加nul到字典

        mutableDictionary.setObject(nil, forKey: "nill")  

//***直接报错,因为数组和字典里面存放的都是对象,对象都是有地址的。但是nil内存中没有地址,所以直接报错

下面是oc版本的,用oc的朋友可以参考一下:

- (void)viewDidLoad {

     [super viewDidLoad];

     NSMutableArray *mutableArray = [NSMutableArray array];

        NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];

      NSNull *null = [NSNull null];

     //  使用NSNull,不会报错会正常运行

     [mutableArray addObject:null];

     [mutableDictionary setObject:null forKey:@"null"];

      // 如果我们使用nil,没运行时回报警告,运行时程序会直接崩溃

     [mutableArray addObject:nil];

    [mutableDictionary setObject:nil forKey:@"nil"];

}

以上就是nil、Nil、NULL、NSNull的区别了,在工作中我们一般只使用nil,其他三个我们平时也很少使用。但是作为程序猿的我们,

这样的问题还是值得我们去了解的。

时间: 2024-10-12 17:45:05

[swift、oc]浅聊nil、Nil、NULL、NSNull的区别的相关文章

nil / Nil / NULL / NSNull 的区别

NULL在C中被定义,但是C并不包括nil.Nil和NSNull,这三者属于Objective-C(下称OC)部分. NULL是什么? int *a = NULL; A null pointer to anything else, is for C-style memory pointers. 它是C类型的一个指针变量,确切地说是一个空指针,不指向任何地方,在内存上它的值被设置为0.比如说int *pointer = NULL,指针变量pointer在内存里的值为0,不指向任何地方. 本质:空指

iOS中使用nil NULL NSNULL的区别

nil NULL NSNULL的区别主要以下几点 1.nil:一般赋值给空对象 2.NLL:一般赋值给nil之外的其他空值.入SEL等. 3.NSULL:NSNULL只有一种方法+ (NSNull *) null; [NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值 4.注意:当想ni发送信息的时候,返回NO,不会有异常,程序可以继续执行下去:而向NSNULL对象发送消息的时候会收到异常 nil: A null pointer to an

nil/Nil/NULL/NSNull的区别

平时开发过程中经常遇到这几个表示空的关键字:nil.Nil.NULL,一向搞不清楚,作为一个有两年开发经验的程序员,连那么基础的东西都不知道未免太丢人了. 首先要说明的是,nil.Nil.NULL三个关键字和NSNull类都是表示空,只是用处不一样,具体的区别如下: 一.NULL 1.声明位置 stddef.h文件 2.定义 [objc] view plaincopy #undef NULL #ifdef __cplusplus #  if !defined(__MINGW32__) &&

在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系

nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something Nil表示一个类指针为空,针对类 >示例代码: Class someClass = Nil; Class anotherClass = [NSString class]; NULL表示基本数据类型为空,基本类型 >

类和对象 nil/Nil/NULL的区别

iOS-----类和对象,nil/Nil/NULL的区别 iOS中类和对象,nil/Nil/NULL的区别 类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据类型,它的变量就是对象. 类与类之间的关系——继承关系 A是B 如果这句话说的通,在设计程序的时候就可以看成是继承关系. 例如:学生与小学生 小学生也是学生,所以学生是小学生的父类,小学生是学

OC语法--nil、 Nil、 NULL 、NSNul用法及OC异常处理

nil Nil NULL NSNul nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNul:在集合对象中,表示空值的对象 若obj为nil: [obj message]将返回NO,而不是NSException 若obj为NSNull: [obj message]将抛出异常NSException OC异常处理: Cup *cup = [[Cup alloc] init]; @try { [cup fill]; } @cat

OC中Nil、nil、NULL、NSNull、class、Class

原先对此很迷惑,但是在网上看了很多文章后略有所得. 1.Class和class class指类,类是对象(object)的类型.比如 NSString *str = [[NSString alloc]init]: NSString就是一个class,是对象str的类型. Class指类的类型,比如:Class aclass = [NSString class]: aclass就是一个类,就是NSString这个类,而Class就势aclass的类型. 2.Nil.nil.NSNull.NULL

OC 中NULL nil和NSNULL的区别

一.nil:nil是oc的,nil是一个空的对象,指针地址指向的是NULL 在oc中,可以给nil发送任何消息,都不会报错 二.NULL:是c的,空地址,数字,本身的数值是0  不能给NULL消息 三.NSNULL :是为了向数组或者字典中添加空值使用的 从Xcode6开始,取消了NULL的只能提示,因为swift 中没有NULL的概念,只有nil -在OC中,使用NULL或者nil都不会出错 -但是:从概念的角度而言,**(指针的指针)的参数,不想获取对ui内容,应该传入NULL -OC中提供

[Swift中错误]missing argument label 'greeting:' in call

Swift 中出现这个问题:从第二个参数起,自动加上lable func sayHello(name:String? ,greeting:String)->String { let result = greeting + "," + (name ?? "Guest") + "!" return result } var nickname:String? nickname = "yc" //“Goodmorning前面应该