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
如有错误,欢迎随时指正!