打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
博客

让人崩溃的野指针,下面进入正题,废话不多说了,说多了都是泪。。。。。。

一、首先说一下什么是空指针,什么是野指针,什么是僵尸对象

1.空指针

1) 没有存储任何内存地址的指针就称为空指针(NULL指针)

2) 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。

quote here

ShadowTimeMapVC str_device1 = NULL;ShadowTimeMapVC str_device2 = nil;

2.野指针

"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。

1) C语言: 当我们声明1个指针变量,没有为这个指针变量赋初始值.这个指针变量的值是1个垃圾指 指向1块随机的内存空间。2) OC语言: 指针指向的对象已经被回收掉了.这个指针就叫做野指针.

3.僵尸对象 (此处为引用)

1) 内存回收的本质.申请1块空间,实际上是向系统申请1块别人不再使用的空间.释放1块空间,指的是占用的空间不再使用,这个时候系统可以分配给别人去使用.

    在这个个空间分配给别人之前 数据还是存在的.        OC对象释放以后,表示OC对象占用的空间可以分配给别人.        但是再分配给别人之前 这个空间仍然存在 对象的数据仍然存在.    僵尸对象: 1个已经被释放的对象 就叫做僵尸对象.. 使用野指针访问僵尸对象.有的时候会出问题,有的时候不会出问题.    当野指针指向的僵尸对象所占用的空间还没有分配给别人的时候,这个时候其实是可以访问的.    因为对象的数据还在.    当野指针指向的对象所占用的空间分配给了别人的时候 这个时候访问就会出问题.    所以,你不要通过1个野指针去访问1个僵尸对象.        虽然可以通过野指针去访问已经被释放的对象,但是我们不允许这么做.. 僵尸对象检测.    默认情况下. Xcode不会去检测指针指向的对象是否为1个僵尸对象. 能访问就访问 不能访问就报错.    可以开启Xcode的僵尸对象检测.        那么就会在通过指针访问对象的时候,检测这个对象是否为1个僵尸对象 如果是僵尸对象 就会报错.. 为什么不默认开启僵尸对象检测呢?    因为一旦开启,每次通过指针访问对象的时候.都会去检查指针指向的对象是否为僵尸对象.    那么这样的话 就影响效率了.

. 如何避免僵尸对象报错.

当1个指针变为野指针以后. 就把这个指针的值设置为nil

僵尸对象无法复活.

当1个对象的引用计数器变为0以后 这个对象就被释放了.就无法取操作这个僵尸对象了. 所有对这个对象的操作都是无效的.因为一旦对象被回收 对象就是1个僵尸对象 而访问1个僵尸对象 是没有意义.

二、如何 解决野指针 crash1)打断点,在多次测试的情况下,崩掉的大概位置你应该知道的,比如说某个页面,某个操作2) 打印日志,在多线程并发的时候遇到的,打断点有时候跟踪不过去,就在崩掉的操作打印日志,根据日志去判断大概的位置,如果是什么操作一起的崩掉都不知道,那每个方法开始和结尾都打印一个日志,跟据这个断点,可以知道大概崩在哪里3)添加一个全局断点

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS 释放内存/指针清空(release/=nil)深度讨论
C++中内存泄漏的几种情况
iOS调试Bug方式之
对象析构谈—— delete this 的使用及注意事项 - 永争一流是我的信仰! - C...
伯乐在线博客
从C语言到C++你必须学会的---动态内存和智能指针
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服