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

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

[BS-22] Objective-C中nil、Nil、NULL、NSNull的区别的更多相关文章

  1. iOS中使用nil NULL NSNULL的区别

    nil NULL NSNULL的区别主要以下几点 1.nil:一般赋值给空对象 2.NLL:一般赋值给nil之外的其他空值.入SEL等. 3.NSULL:NSNULL只有一种方法+ (NSNull * ...

  2. Objective C 中的nil,Nil,NULL和NSNull理解

    kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...

  3. 在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系和UISlider不能拖动的问题

    nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; ...

  4. iOS nil,Nil,NULL,NSNULL的区别

    nil (id)0 是OC对象的空指针,可正常调用方法(返回空值,false,零值等) Nil  (Class)0 是OC类的空指针,主要运用于runtime中,Class c = Nil; 其他特性 ...

  5. delphi中nil、null、UnAssigned区别

    nil:空指针,空地址,对象也是指针,所以可以object := nil;null:null是一个未定义值的变量,既不是0也不代表空字符串,它是未定义的.http://www.delphibasics ...

  6. Java中空串和null串的区别

    对于空串来说这是一个对象他被""这个对象给实例化了只是他的长度为0字符的内容为空. 而String变量中还可以存储一个特殊的值,这个是null,这个表示没有和其他的对象与这个变量相 ...

  7. 你还不知道mysql中空值和null值的区别吗?

    前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table tes ...

  8. nil/Nil/NULL/NSNull

    nil/Nil/NULL/NSNull的区别 一个简单的小例子: NSObject *obj = nil; NSLog(@"%@",obj); =>null NSObject ...

  9. Objective-C 中nil/Nil/NULL/NSNull

    转自:http://nshipster.cn/nil/ 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居民,而原因在于逻辑宇宙的存在不确定性.作为 ...

随机推荐

  1. android之dialog

    先编写activity_main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  2. Export-XLSX PowerShell generate real Excel XLSX files without Excel and COM

    http://gallery.technet.microsoft.com/scriptcenter/Export-XLSX-PowerShell-f2f0c035

  3. 清橙 A1206 小Z的袜子(莫队算法)

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:1357   AC次数:406   平均分:46.75   将本题分享到:        查看未格式化的试题 ...

  4. POJ 1419 Graph Coloring(最大独立集/补图的最大团)

    Graph Coloring Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4893   Accepted: 2271   ...

  5. [kuangbin带你飞]专题六 最小生成树

    学习最小生成树已经有一段时间了 做一些比较简单的题还算得心应手..花了三天的时间做完了kuangbin的专题 写一个题解出来记录一下(虽然几乎都是模板题) 做完的感想:有很多地方都要注意 n == 1 ...

  6. PHP 错误与异常 笔记与总结(18 )页面重定向实现

    在发生错误时,将用户重定向到另一个页面. <?php header('content-type:text/html; charset=utf-8'); class ExceptionRedire ...

  7. AngularJS 初识笔记

    test.html: <!DOCTYPE html> <html lang="en" ng-app> <head> <meta chars ...

  8. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式

    方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时 ...

  9. 腾讯星座运势api

    请求地址: http://app.data.qq.com/?umod=astro&act=astro&jsonp=1&func=TodatTpl&t=4&a=t ...

  10. hot code replace

    http://wiki.eclipse.org/FAQ_What_is_hot_code_replace%3F https://social.msdn.microsoft.com/Forums/vst ...