OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结
周末与一个老朋友吃饭聊天,因为他正在培训班学习iOS开发,就随便聊了几句,发现自己OC基础上的欠缺和一些知识点的混淆。特此整理如下。
1.空指针
没有存储任何内存地址的指针就称为空指针(NULL指针)
空指针就是没有被具体初始化之前,其值为0的指针
来两个例子
Person *p1 = nil;
Person *p2 = NULL;
下边会给出nil和NULL的区别
2.野指针
“野指针”不是空指针,野指针是指向了一块不可用的内存地址的指针,也就是说,野指针内是有保存一个内存地址的值,但是,指向的那个内存地址可能已经被释放,或者销毁。野指针会导致程序崩溃。
来个野指针的例子
Person *p1 = [[Person alloc]init];
[p1 setName:@"Rose"];
Person *p2 = p1;
[p1 release];
[p2 setName:@"Jack"];
上边的例子中,Person类中有方法setName:可以设置Person的姓名。
第3行代码中,将p1的内存地址赋值给p2,所以此时,p2和p1指向同一个内存空间。
第4行代码中,将p1的内存计数做一次release操作,根据内存管理机制,p1的内存地址被销毁。此时p2指针依然保存的是之前的地址的值。
第5行代码中,给p2所指向的对象发送了setName:的消息,但是此时对象已经被销毁了,内存已经不属于销毁对象了,所以代码会直接报错。
3.空指针和野指针
就上边的例子,我们来谈谈空指针和野指针的区别,首先我们看一个例子。
Person *p1 = [[Person alloc]init];
[p1 setName:@"Rose"];
Person *p2 = p1;
[p1 release];
p2 = nil;
[p2 setName:@"Jack"];
我们新加了第5行代码,将p2置为空指针,此时程序不会报错,这是因为p2是一个空指针,没有指向任何一个对象内存,因此,setName:消息是无法发送出去的,不会造成任何的影响,当然也不会报错。
所以,可以总结一下空指针和野指针的不同之处:
空指针中没有保存对象地址的值,野指针中一般保存了已销毁对象的内存地址值。
向空指针发送消息不会报错,但是给野指针发送消息会报错
野指针是非常危险的,非常危险的,非常危险的。。。重要的事情说三遍。借用别人的一句话:“设想,你家里有个物体,不知什么时候会突然出现,也不知道什么时候突然消失。会把你的东西乱挪乱动,还时不时打碎一个瓶子”
关于指针,有很多需要注意的操作事项,指针很强大,所以操作它需要很小心,操作不当的野指针,会造成不可预估的严重后果。
如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它 指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟 了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了。
所以我们必须设定一个空间让指针指向它,或者把指针设为NULL,这是怎么样的一 个原理呢?
如果是建立一个与指针相同类型的空间,实际上是在内存中的空白区域中开辟了这么一个受保护的内存空间,然后用指针来指向它,那么指针里的地址就 是这个受保护空间的地址了,而不是不可预知的啦,然后我们就可以通过指针对这个空间进行相应的操作了;如果我们把指针设为NULL,我们在头文件定义中的 #define NULL 0 可以知道,其实NULL就是表示0,那么我们让指针=NULL,实际上就是让指针=0,如此,指针里的地址(机器数)就被初始化为0了,而内存中地址为0 的内存空间……不用多说也能想象吧,这个地址是特定的,那么也就不是不可预知的在内存中乱指一气的野指针了。(摘自知乎用户郭无心)
4.nil、Nil、NULL、NSNULL的含义和区别
nil:OC中的对象的空指针
Nil:OC中类的空指针
NULL:C类型的空指针
NSNull:数值类的空对象
数值类:NSNumber,NSvalue,NSNull
此处说一下NSNull,在集合中不能nil值,因为NSArray和NSDictionary中nil有特殊的含义。但是有些时候,需要在集合中存放空值,比如个人信息中,只知道姓名,不知道电话号码,此时,有必要将电话号码设置为空,这时,就用到了NSNull。
NSNull中只有一个null方法 :[NSNull null]
[dic setObject:[NSNull null] forKey:@"phoneNumber"];
if(phoneNumber == [NSNull null]){
//...
}
OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结的更多相关文章
- OC中的野指针(僵尸指针)
涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]i ...
- [BS-21] 关于OC中对象与指针的思考
关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...
- OC中的self指针
在OC中,self是一个指针,方法和属性可以通过self.function进行访问:成员变量使用self->变量名进行访问.调用方法还可以用[self function]; OC中的self有点 ...
- C中的野指针—如何避免
转自:http://www.cnblogs.com/viviwind/archive/2012/08/14/2638810.html 先看一个例子: struct student{ char* nam ...
- Android的BUG(二) - SurfaceTexture中的野指针
当初遇到这个bug,是不定期的低概率出现,最后找到一个比较容易重现的步骤: 启动系统 然后进google + 新建一个帐号(注意是新建一个帐号) 没几步就重启了 这个BUG,一开始追踪也是无头绪的 ...
- 44 (OC)* 野指针、空指针
一: 空指针 : 没有存储任何内存地址的指针就称为空指针(NULL指针). 被赋值为nil的指针,在没有被具体初始化之前,为nil.nil.Nil.NULL.NSNULL的含义和区别 nil:OC中的 ...
- OC-引用计数器,内存管理,野指针
总结 全局断点 →-->+-->Add Exception Breakpoint 开启僵尸监听 打开Edit scheme -->Diagnostics-->Enable Zo ...
- nil、Nil、NULL与NSNull的区别及应用
总结 nil:OC中的对象的空指针 Nil:OC中类的空指针 NULL:C类型的空指针 NSNull:数值类的空对象 详细解析应用如下: 1.nil 指向一个对象的指针为空 在objc.h中的定义 ...
- iOS nil,Nil,NULL,NSNULL的区别
nil (id)0 是OC对象的空指针,可正常调用方法(返回空值,false,零值等) Nil (Class)0 是OC类的空指针,主要运用于runtime中,Class c = Nil; 其他特性 ...
随机推荐
- Retrofit,Rxjava,OkHttp3的配置
这几个库的版本都更新了,和以前的使用略有不同,这是两篇介绍的博客:http://www.jianshu.com/p/91ac13ed076d ,https://drakeet.me/retrofit- ...
- 第二节windows系统下Xshell 5软件远程访问虚拟机 Linux系统
下载Xshell 5软件在windows下安装 安装好后Xshell 5启动软件 下一步,检查虚拟机,配置是否正确 下一步,设置网络,保障虚拟机系统能够连接网络 下一步,进入虚拟机系统,检查虚拟机网络 ...
- ZOJ Martian Addition
Description In the 22nd Century, scientists have discovered intelligent residents live on the Mars. ...
- LeetCode OJ 11. Container With Most Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- Lynis 2.2.0 :面向Linux系统的安全审查和扫描工具
Lynis是一款功能非常强大的开源审查工具,面向类似Unix/Linux的操作系统.它可以扫描系统,查找安全信息.一般的系统信息.已安装软件及可用软件信息.配置错误.安全问题.没有设密码的用户帐户.错 ...
- SQL_where条件的优化
原则,多数数据库都是从 左到右的顺序处理条件,把能过滤更多数据的条件放在前面,过滤少的条件放后面 SQL1: select * from employee where sala ...
- java的string.split()分割特殊字符时注意点
[1]单个符号作为分隔符 String address="上海|上海市|闵行区|吴中路"; String[] splitAddress=address.s ...
- js 禁止重复提交
/*分享按钮*/ var flag = true; $(".recommed a").click(function() { if (flag == true) { getServe ...
- 存储过程sql语句
select count(virtualacc) into v_count from T_ATMMONITOR WHERE virtualacc = v_number; 用于存储过程中,是把coun ...
- Flask -- 使用数据库(Sqlite3)、用户注册、登录注销、修改密码
# 使用sqlite数据库 import sqlite3from contextlib import closing app.config.update( DATABASE = 'my.db', #相 ...