【Objective-C】09-空指针和野指针
一、什么是空指针和野指针
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];
【Objective-C】09-空指针和野指针的更多相关文章
- Objective-C 空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- C++的空指针、野指针和指针赋值NULL.md
1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...
- 【Objective-C】-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 浅谈 “空指针、野指针、void*”
Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是 ...
- C语言指针2(空指针,野指针)
//最近,有朋友开玩笑问 int *p *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...
- OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结
周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆.特此整理如下. 1.空指针 没有存储任何内存地址的指针就称为空指针(NULL指针) ...
- 李洪强iOS开发之【Objective-C】09-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 【Objective-C】4-空指针和野指针
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...
- 关于空指针NULL、野指针、通用指针 (转)
reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白 ...
随机推荐
- Jquery 自定义动画同步进行如何实现?
需求描述:我需要对不懂的两个HTML对象进行操作,同时开始动画,同时结束动画. 遇到问题:如果先后对连个对象进行 animate动画,那么第一个会先运行,等第一个运行完了运行第二个,这样就不同步了. ...
- (三)Python3 循环语句——while
while语句的一般形式: while 判断条件: 语句 同样需要注意冒号和缩进.另外,在 Python 中没有 do..while 循环. 以下实例使用了 while 来计算 1 到 100 的总和 ...
- python datetime,time时间格式和用法
我是转载的这个大神的 他的网址:https://www.cnblogs.com/wanglinjie/p/9226926.html #以下是time的方法 >>> import ...
- LeetCode(118) Pascal's Triangle
题目 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, R ...
- pycharm调整字体大小
问题:pycharm的默认字体比较小,看起来费眼睛 解决办法: 1.打开 file-->settings 2.Editor-->font 注意:没有修改过的需求先保存一下才能修改size
- python-通过openpy操作excel
1.安装 openpyxl pip install openpyxl == 2.3.5 安装指定版本 遇到问题: 查询结果:这是因为电脑上有其他软件也有pip命令,我的电脑上是因为装了loadrun ...
- 设置vim配置文件使得tab为4个空格
1 set ts=4 2 set expandtab 3 set autoindent
- TOJ 2703: Cow Digit Game
2703: Cow Digit Game Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte Total Submit ...
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...
- 转载 :sql server 2005 无法删除数据库 "#Test",因为该数据库当前正在使用
无法删除数据库 "#Test",因为该数据库当前正在使用 --查询分析器中执行下面的语句就行了. use master go declare @dbname sysname set ...