zoukankan      html  css  js  c++  java
  • [BS-22] Objective-C中nil、Nil、NULL、NSNull的区别

    Objective-C中nil、Nil、NULL、NSNull的区别

    1.定义:

    nil:      OC语言定义:#define nil __DARWIN_NULL   /  #define __DARWIN_NULL ((void *)0)

    Nil:      OC语言定义:#define nil __DARWIN_NULL   /  #define __DARWIN_NULL ((void *)0)

    NULL:  C语言定义: #define NULL ((void*)0)

    NSNull:  OC语言定义: NSNull是继承于NSObject的类。只有一个类方法,返回一个空对象。该对象存在于堆中,是有内存地址的。

    //NSNull类的声明
    @interface NSNull : NSObject <NSCopying, NSSecureCoding>
    + (NSNull *)null;
    @end

      

    2.图解:

    1. 说明NULLnilNil这三者对于OC中值是一样的,都是(void *)类型,类似于OC中的id类型,其本质都是指针常量。

    2. 因NULLnilNil是指针类型,故可以给任何指针类型的变量赋值。

    3. NULLnilNil是指针,它们自身的地址都是0x0(据说是内存的0点处),4B的存储空间中保存的值是0或者(null)。

    4.  oc中存储堆中内存块地址的指针可看作对象,NULLnilNil虽是指针,但它们保存的地址是(null),应该不是堆中真实存在的,故不能看作对象。

    5. [NSNull null]是堆内存中真实存在的对象,有内存地址,只是其中存储的值为<null>。

    6. C语言中,我们定义了一个指针,当我们使用完以后,通常会设置指向NULL。如果没有设置,这个指针就成了所谓的野指针,然后其它地方不小心访问了这个指针是很容易造成非法访问的,常见的表现就是崩溃了。 在OC中如果手动管理内存,将对象指针p进行release操作,当对象的引用计数为0后,对象就会被销毁,此时指针p仍存活在栈中,仍然保存着原来堆中的那块地址。此时需要立即将p = nil; 这样p中就保存着nil(内存起始处地址),OC默认可以向nil发送任何消息,程序什么都不做,这样可避免崩溃。

    7. 由此看来,OC中的nil/Nil和 C语言中的NULL没有太大区别,作用也基本相同。nil用于给已销毁普通对象的指针赋值,Nil用于给已销毁的类对象指针赋值,NULL用于给C语言中已销毁的数据结构的指针赋值。都可以避免出现野指针(C语言说法)或僵尸指针(OC说法)。

    3.关于空指针和野指针优秀博文推荐:http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html 

    文章原创,转载请注明出处:http://www.cnblogs.com/stevenwuzheng/p/5494734.html

    如有错误,欢迎随时指正!

  • 相关阅读:
    支付宝支付内容 尚未完成
    mvc 高并发解决方案之一---存储过程
    微信第三方平台开头篇--MVC代码(第三方获取ticket和公众号授权)
    卡券类字段
    Jquery 方法学习
    c# 对象反射赋值未知属性需类型转换
    C# enum 枚举 反射
    MVC c# 调用sql的存储过程
    Javascript装饰器原理
    关于阿里云的产品应用思考
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5494734.html
Copyright © 2011-2022 走看看