[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. 说明NULL、nil、Nil这三者对于OC中值是一样的,都是(void *)类型,类似于OC中的id类型,其本质都是指针常量。
2. 因NULL、nil、Nil是指针类型,故可以给任何指针类型的变量赋值。
3. NULL、nil、Nil是指针,它们自身的地址都是0x0(据说是内存的0点处),4B的存储空间中保存的值是0或者(null)。
4. oc中存储堆中内存块地址的指针可看作对象,NULL、nil、Nil虽是指针,但它们保存的地址是(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的区别的更多相关文章
- iOS中使用nil NULL NSNULL的区别
nil NULL NSNULL的区别主要以下几点 1.nil:一般赋值给空对象 2.NLL:一般赋值给nil之外的其他空值.入SEL等. 3.NSULL:NSNULL只有一种方法+ (NSNull * ...
- Objective C 中的nil,Nil,NULL和NSNull理解
kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...
- 在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系和UISlider不能拖动的问题
nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; ...
- iOS nil,Nil,NULL,NSNULL的区别
nil (id)0 是OC对象的空指针,可正常调用方法(返回空值,false,零值等) Nil (Class)0 是OC类的空指针,主要运用于runtime中,Class c = Nil; 其他特性 ...
- delphi中nil、null、UnAssigned区别
nil:空指针,空地址,对象也是指针,所以可以object := nil;null:null是一个未定义值的变量,既不是0也不代表空字符串,它是未定义的.http://www.delphibasics ...
- Java中空串和null串的区别
对于空串来说这是一个对象他被""这个对象给实例化了只是他的长度为0字符的内容为空. 而String变量中还可以存储一个特殊的值,这个是null,这个表示没有和其他的对象与这个变量相 ...
- 你还不知道mysql中空值和null值的区别吗?
前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table tes ...
- nil/Nil/NULL/NSNull
nil/Nil/NULL/NSNull的区别 一个简单的小例子: NSObject *obj = nil; NSLog(@"%@",obj); =>null NSObject ...
- Objective-C 中nil/Nil/NULL/NSNull
转自:http://nshipster.cn/nil/ 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居民,而原因在于逻辑宇宙的存在不确定性.作为 ...
随机推荐
- 解决win7系统远程桌面 server 2003 卡的问题
原因在于从vista开始,微软在TCP/IP协议栈里新加了一个叫做“Window Auto-Tuning”的功能.这个功能本身的目的是为了让操作系统根据网络的实时性能(比如响应时间)来动态调整网络上传 ...
- Self Service Password (SSP)
安装SSP, 依赖包包括php5, php5-ldap, php5-mcrypt 启用mcrypt功能: sudo php5enmod mcrypt 第一部分: Apache 安装Apache, 并且 ...
- 在Excel中实现查询功能
$sn = Read-Host -Prompt "请输入员工号|序列号|资产号" $xl = New-Object -ComObject "Excel.Applicati ...
- ci实现RBAC,详细解释原理和核心代码显示
代码实现不复杂,主要是思路的理解 RBAC是基于权限控制 1.权限结点管理 2.角色管理 3.管理员权限分配 结点管理就是把所有的分组 控制器 方法全部写入一个结点管理表 请注意在写一个动作比如,展示 ...
- UAPStudio授权过期的解决方法,重新授权
1.启动lisence服务器,生成硬件锁, 并导入授权. 需要注意的地方:1.点击工具栏“帮助”下的“UAP-STUDIO”授权管理. 2.删除“D:\UAP-STUDIO\Platform\bin” ...
- IDM 通过防火墙规则阻止激活验证
1. 打开Windows防火墙 2. 高级设置-->出站规则-->新建规则 3. 添加IDM程序路径,阻止连接 4. 在属性中添加作用域,远程IP地址: DNS解析出IP:register ...
- PROTEL99SE封装说明
PROTEL99SE封装说明 路板上的焊盘间的距离也就是300mil(因为在电机领域里,是以英制单位为主的.同样的, 对于无极性的电容,RAD0.1-RAD0.4 也是一样:对有极性的电容如电解电容 ...
- Selenium 遇到的问题
1. How to Resolve Stale Element Reference Exception? First of all lets be clear about what a WebElem ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(4)
蓝牙是一种短距离的通讯方式,它设计的意图是取代电子便携设备之间的有线电缆连接.蓝牙的主要特性是健壮性.低功耗.成本低,它工作于免费的2.4无线传输频段. 蓝牙有两种技术系统:基本速率Basic Rat ...
- 最大子序列和 o(n)
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, ...