iOS 关于僵尸对象和僵尸指针的那些事儿
2016-07-11 19:56
239 查看
引言
提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物。哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie Pointer)和僵尸对象(Zombie Object)。野指针
先来介绍一下野指针,C/C++中对野指针的定义为:野指针就是指向垃圾内存的指针,这个指针地址不是NULL。如果给一个指针赋值为NULL,那么该指针就是一个空指针,可以用if语句判读。但是对于野指针不能用if语句判断。野指针产生的原因
1)指针变量没有被初始化。任何指针在创建时都不会自动赋值为NULL,那么如果不初始化,它指向的内存地址是不确定的。所以在创建时,应该进行初始化。char *ptr = NULL; char *str = (char*)malloc(32);
2)指针被释放(free或malloc)之后,没有设置为NULL,误以为是个合法指针。
void function( void ) { char* str = new char[100]; delete[] str; // Do something strcpy( str, "Dangerous!!" ); }
3)指针操作超出了变量的作用范围。
class A { public: void Func(void){ cout << “Func of class A” << endl; } }; void Test(void) { A *p; { A a; p = &a; // 注意 a 的生命期 } p->Func(); // p是“野指针” }
函数 Test 在执行语句 p->Func() 时 ,对象 a 已经消失,而 p 是指向 a 的,所以 p 就成了 “野指针”。
僵尸指针
“僵尸指针”就是野指针的一种情况,即该指针指向的对象已经被释放,但是却没有对当前指针赋值为nil。僵尸对象
简单的来说,僵尸对象是已经被释放的对象。如果在程序中再度使用该对象,一般会出现如下报错:unrecognized selector sent to instance
今天就遇到了这样的一个报错:
解决方案
可以在Xcode的scheme页面中设置NSZombieEnabled环境变量。点击Product——>Edit Scheme打开该页面,然后勾选Enable Zombie Objects 复选框。如下图所示:NSZombieEnabled变量用来调试与内存有关的问题,跟踪对象的释放过程。启用了NSZombieEnabled,它会用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是在你向它发送消息时,它会显示一段日志并自动跳入调试器。启用NSZombie而不是让应用直接崩溃掉时,一个错误的内存访问就会变成一条无法识别的消息发送给僵尸对象。僵尸对象会显示接受到得信息,然后跳入调试器,这样你就可以查看到底是哪里出了问题。
为什么不默认开启僵尸对象检测呢?
因为一旦开启,每次通过指针访问对象的时候,都会去检查指针指向的对象是否为僵尸对象。所以会影响程序的执行效率,建议关闭。
相关文章推荐
- GIT所能设及到的所有命令行
- iOS与HTML5交互方法总结
- iOS 实现扇形统计图
- [小技巧]自定义图片的圆角
- iOS-可变参数va_list、va_start、va_arg、va_end、NS_FORMAT_FUNCTION(1, 2)
- iOS开源代码—刮刮卡
- iOS 高级工程师是怎么进阶的(补充版20+点)
- iOS Provisioning Profile(Certificate)与Code Signing详解
- iOS添加自动更新的代码
- iOS—keyWindow
- iOS—Model,Controller,View
- ios tabbar隐藏
- 阿里weex研究iOS(一)playground内容空白问题
- 自定义导航栏
- IOS AFNetworking 更新上传进度条
- iOS多线程--下(GCD)
- iOS 获取本地的坐标
- 入驻CSDN博客
- OC方法、属性
- 单例的PCH宏定义