您的位置:首页 > 移动开发 > Objective-C

[BS-22] Objective-C中nil、Nil、NULL、NSNull的区别

2016-05-17 13:57 627 查看

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

如有错误,欢迎随时指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: