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

时间:2022-08-09 15:30:56

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说法)。

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

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

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

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