OC中的野指针,空指针,nil,Nil,NULL,NSNULL小结

时间:2023-02-27 18:57:03

周末与一个老朋友吃饭聊天,因为他正在培训班学习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小结的更多相关文章

  1. OC中的野指针(僵尸指针)

    涉及到内存管理问题的都是类类型的变量,而在OC中我们操纵这些对象都是通过操纵指向他们的指针来完成的,一致很多时候会忽略指针存在.比如定义UIView * view = [[UIView alloc]i ...

  2. [BS-21] 关于OC中对象与指针的思考

    关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...

  3. OC中的self指针

    在OC中,self是一个指针,方法和属性可以通过self.function进行访问:成员变量使用self->变量名进行访问.调用方法还可以用[self function]; OC中的self有点 ...

  4. C中的野指针—如何避免

    转自:http://www.cnblogs.com/viviwind/archive/2012/08/14/2638810.html 先看一个例子: struct student{ char* nam ...

  5. Android的BUG(二) - SurfaceTexture中的野指针

    当初遇到这个bug,是不定期的低概率出现,最后找到一个比较容易重现的步骤: 启动系统 然后进google +  新建一个帐号(注意是新建一个帐号)  没几步就重启了 这个BUG,一开始追踪也是无头绪的 ...

  6. 44 (OC)* 野指针、空指针

    一: 空指针 : 没有存储任何内存地址的指针就称为空指针(NULL指针). 被赋值为nil的指针,在没有被具体初始化之前,为nil.nil.Nil.NULL.NSNULL的含义和区别 nil:OC中的 ...

  7. OC-引用计数器,内存管理,野指针

    总结 全局断点 →-->+-->Add Exception Breakpoint 开启僵尸监听 打开Edit scheme -->Diagnostics-->Enable Zo ...

  8. nil、Nil、NULL与NSNull的区别及应用

      总结 nil:OC中的对象的空指针 Nil:OC中类的空指针 NULL:C类型的空指针 NSNull:数值类的空对象 详细解析应用如下: 1.nil 指向一个对象的指针为空 在objc.h中的定义 ...

  9. iOS nil,Nil,NULL,NSNULL的区别

    nil (id)0 是OC对象的空指针,可正常调用方法(返回空值,false,零值等) Nil  (Class)0 是OC类的空指针,主要运用于runtime中,Class c = Nil; 其他特性 ...

随机推荐

  1. softwareTesting_work2_question2

    work2类 package com.Phantom; import java.util.Scanner; import javax.print.DocFlavor.INPUT_STREAM; pub ...

  2. js back动作

    history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 history.back(0) 刷新 ...

  3. SQL Server 分隔字符串函数实现

    在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...

  4. mousedown(function(){ return false; })作用

    mousedown(function(){ return false;});  阻止浏览器的默认行为.  比如a你加个空连接,可能会在当前页跳转, 你加了这句,就可以阻止a跳转,然后只执行js函数的代 ...

  5. 【Unity3D游戏开发】性能优化之spine提高80~90%的效率 (三一)

    Spine效率低 Unity项目加载spine动画,经常会出现卡顿的情况,如游戏中瞬间播放一个动画,打开一个带spine动画的界面.尤其是SkeletonRenderer.Awake时,会瞬间出现大量 ...

  6. Lua学习笔记(一):搭建开发环境

    Lua是一个小巧高效的解释型脚本语言,可以方便的嵌入到任意的语言中,很多应用程序.游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性.可扩展性.这其中包括魔兽世界.博德之门.愤怒的小鸟.VOC ...

  7. AndroidStaggeredGrid

    https://github.com/etsy/AndroidStaggeredGrid

  8. Android-管理Activity生命周期 -重新创建Activity

    按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...

  9. Java Stack源码分析

    Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out).java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的 ...

  10. python ord()与chr()用法以及区别

    ord()函数主要用来返回对应字符的ascii码,chr()主要用来表示ascii码对应的字符他的输入时数字,可以用十进制,也可以用十六进制. >>> ord("a&quo ...