[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如有错误,欢迎随时指正!
相关文章推荐
- Objective-C浮点数转化整数(向上取整、向下取整)
- how to check whether image object has value
- 爬虫:hasattr(object, name)
- UITableView的用法(Objective-C)
- objective-c拉伸图片的三种方法
- Objective-C中NSArray和NSMutableArray是如何使用的?
- object-c中数组的某些知识
- object-c语法--goto语句
- Objective-C小知识收集
- Objective-C中Delegate,Protocol与Interface的区别
- objc_setAssociatedObject通过alert传值
- iOS SDK开发时,有关OC和C++混编造成其它类错误的问题(Compile Sources As Objective-C++)
- 解决div被embed,object覆盖问题
- Objective-C的入门学习笔记
- Objective-C 内存管理——你需要知道的一切
- 编写高质量的Objective-C代码
- Objective-C 的正则表达式库 RegexKitLite
- 上古时代 Objective-C 中哈希表的实现
- AT5 two-dimensional objects - the torus and genus
- OOD - Object Oriented Design 面向对象设计实例