【Objective-C】09-空指针和野指针
2016-01-16 21:03
423 查看
http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html
本文目录
一、什么是空指针和野指针
二、野指针和空指针例子
说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略。学习本专题之前,建议先学习C语言专题。
回到顶部
1>
没有存储任何内存地址的指针就称为空指针(NULL指针)
2>
空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。
下面两个都是空指针:
"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。野指针是非常危险的。
回到顶部
接下来用一个简单的例子对比一下野指针和空指针的区别
运行程序,你会发现第7行报错了,是个野指针错误!
1> 执行完第1行代码后,内存中有个指针变量stu,指向了Student对象
假设Student对象的地址为0xff43,指针变量stu的地址为0xee45,stu中存储的是Student对象的地址0xff43。即指针变量stu指向了这个Student对象。
2> 接下来是第3行代码
这行代码的意思是:给stu所指向的Student对象发送一条setAge:消息,即调用这个Student对象的setAge:方法。目前来说,这个Student对象仍存在于内存中,所以这句代码没有任何问题。
3> 接下来是第5行代码
这行代码的意思是:给stu指向的Student对象发送一条release消息。在这里,Student对象接收到release消息后,会马上被销毁,所占用的内存会被回收。
(release的具体用法会放到OC内存管理中详细讨论)
Student对象被销毁了,地址为0xff43的内存就变成了"垃圾内存",然而,指针变量stu仍然指向这一块内存,这时候,stu就称为了野指针!
4> 最后执行了第7行代码
这句代码的意思仍然是: 给stu所指向的Student对象发送一条setAge:消息。但是在执行完第5行代码后,Student对象已经被销毁了,它所占用的内存已经是垃圾内存,如果你还去访问这一块内存,那就会报野指针错误。这块内存已经不可用了,也不属于你了,你还去访问它,肯定是不合法的。所以,这行代码报错了!
注意第7行代码,stu变成了空指针,stu就不再指向任何内存了
因为stu是个空指针,没有指向任何对象,因此第9行的setAge:消息是发不出去的,不会造成任何影响。当然,肯定也不会报错。
1> 利用野指针发消息是很危险的,会报错。也就是说,如果一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。
2> 利用空指针发消息是没有任何问题的,也就是说下面的代码是没有错误的:
本文目录
一、什么是空指针和野指针
二、野指针和空指针例子
说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略。学习本专题之前,建议先学习C语言专题。
回到顶部
一、什么是空指针和野指针
1.空指针
1>没有存储任何内存地址的指针就称为空指针(NULL指针)
2>
空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。
下面两个都是空指针:
1 Student *s1 = NULL; 2 3 Student *s2 = nil;
2.野指针
"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。野指针是非常危险的。回到顶部
二、野指针和空指针例子
接下来用一个简单的例子对比一下野指针和空指针的区别
1.首先,打开Xcode的内存管理调试开关,它能帮助检测垃圾内存
2.自定义Student类,在main函数中添加下列代码
1 Student *stu = [[Student alloc] init]; 2 3 [stu setAge:10]; 4 5 [stu release]; 6 7 [stu setAge:10];
运行程序,你会发现第7行报错了,是个野指针错误!
3.接下来分析一下报错原因
1> 执行完第1行代码后,内存中有个指针变量stu,指向了Student对象Student *stu = [[Student alloc] init];
假设Student对象的地址为0xff43,指针变量stu的地址为0xee45,stu中存储的是Student对象的地址0xff43。即指针变量stu指向了这个Student对象。
2> 接下来是第3行代码
[stu setAge:10];
这行代码的意思是:给stu所指向的Student对象发送一条setAge:消息,即调用这个Student对象的setAge:方法。目前来说,这个Student对象仍存在于内存中,所以这句代码没有任何问题。
3> 接下来是第5行代码
[stu release];
这行代码的意思是:给stu指向的Student对象发送一条release消息。在这里,Student对象接收到release消息后,会马上被销毁,所占用的内存会被回收。
(release的具体用法会放到OC内存管理中详细讨论)
Student对象被销毁了,地址为0xff43的内存就变成了"垃圾内存",然而,指针变量stu仍然指向这一块内存,这时候,stu就称为了野指针!
4> 最后执行了第7行代码
[stu setAge:10];
这句代码的意思仍然是: 给stu所指向的Student对象发送一条setAge:消息。但是在执行完第5行代码后,Student对象已经被销毁了,它所占用的内存已经是垃圾内存,如果你还去访问这一块内存,那就会报野指针错误。这块内存已经不可用了,也不属于你了,你还去访问它,肯定是不合法的。所以,这行代码报错了!
4.如果改动一下代码,就不会报错
1 Student *stu = [[Student alloc] init]; 2 3 [stu setAge:10]; 4 5 [stu release]; 6 7 stu = nil; 8 9 [stu setAge:10];
注意第7行代码,stu变成了空指针,stu就不再指向任何内存了
因为stu是个空指针,没有指向任何对象,因此第9行的setAge:消息是发不出去的,不会造成任何影响。当然,肯定也不会报错。
5.总结
1> 利用野指针发消息是很危险的,会报错。也就是说,如果一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。2> 利用空指针发消息是没有任何问题的,也就是说下面的代码是没有错误的:
[nil setAge:10];
相关文章推荐
- Object-C--->Swift之(五)函数入门级讲解
- Objective-C UI之UITableView详解
- objective-c宏定义
- Objective-C 10 NSValue和NSNull使用方法
- 水晶报表设置FiledObject支持HTML格式的数据
- Android ObjectAnimator ValueAnimation学习
- IOS开发基础Object-C( 15)-- block的使用方法
- 初识Objective-C
- Non-Maximum Suppression for Object Detection in Python
- Java不可变对象(Immutable Objects)
- Android笔记--对Service、Object、Contentprovider、泛型的理解
- Java提高学习之Object(5)
- Java提高学习之Object(4)
- Java提高学习之Object(3)
- Object-C--->Swift之(五)数组和字典
- Objective-C是动态运行时语言的个人理解
- hibernate class cast exception from object to ...
- Java提高学习之Object(2)
- Java提高学习之Object类详解(1)
- Java Object...可变长度的参数(Varargs)详解