正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写。cocoa提供了僵尸对象(Zombie Object)这个功能,简单的说:启用该调试功能后,运行时会将所有已回收的实例转化为特殊的“僵尸对象”,而不会真正回收它们。这种对象在核心内存无法重用,因此不可能遭到覆写。僵尸对象收到消息后会抛出异常,其中说明了发送来的消息,并描述了回收之前的对象。僵尸对象是调试内存管理问题的最佳方式。

之要将环境变量NSZombieEnabled设为YES,即可启用该功能:

export NSZombieEnabled="YES"
./xxx
#或者
NSZombieEnabled="YES" ./xxx

在Xcode中也可以打开次选项,在应用程序的Scheme里,具体版本的Xcode略有不同,大家可自行搜索。

下面写一段测试代码:

#import <Foundation/Foundation.h>

@interface HyClass:NSObject
@end

@implementation HyClass
@end

void show_class_info(id obj){
    Class cls = object_getClass(obj);
    //Class cls = [obj class];
    Class scls = class_getSuperclass(cls);
    NSLog(@"%s : %s",class_getName(cls),class_getName(scls));
}

int main(void){
    @autoreleasepool{
        HyClass *obj = [[HyClass alloc] init];
        NSLog(@"Before release:");
        show_class_info(obj);
        [obj release];
        NSLog(@"After release:");
        show_class_info(obj);
    }
    return 0;
}

在未开启僵尸模式情况下执行结果为:

wisy@wisy-pad:~/src/objc_src/linux$ ./z
2015-06-22 09:28:47.752 z[2120:2120] Before release:
2015-06-22 09:28:47.784 z[2120:2120] HyClass : NSObject
2015-06-22 09:28:47.784 z[2120:2120] After release:
段错误 (核心已转储)

在已开启后结果如下:

wisy@wisy-pad:~/src/objc_src/linux$ NSZombieEnabled="YES" ./z
2015-06-22 09:29:35.566 z[2131:2131] Before release:
2015-06-22 09:29:35.581 z[2131:2131] HyClass : NSObject
2015-06-22 09:29:35.581 z[2131:2131] After release:
2015-06-22 09:29:35.581 z[2131:2131] NSZombie : nil

注意以上代码编译不可以开启ARC模式,因为ARC模式不允许显示调用release方法。

下面再测试一下实际给僵尸对象发送消息结果如何:

[obj description];
//运行结果:
2015-06-22 09:55:51.710 z[2828:2828] *** -[HyClass description]: message sent to deallocated instance 0x1b95990

实际上以上代码编译和执行环境为ubuntu,如果在OSX中,反馈效果会更好。

objective-c中所谓的僵尸对象的更多相关文章

  1. iOS僵尸对象之研究

    Zombie Objects对象研究 一.Xcode 关闭ARC project -> Build settings  搜索 Automatic Reference Counting       ...

  2. iOS-野指针与僵尸对象

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

  3. iOS中僵尸对象的实现方法

    什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都 ...

  4. IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

    硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...

  5. iOS 关于僵尸对象和僵尸指针的那些事儿

    引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...

  6. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  7. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  8. iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

    1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...

  9. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

随机推荐

  1. windows 7、8分区

    如果你的机器一开始安装的是windows7或者8, 一般分配的分区都是主分区.如果你想再搭配个linux操作系统,搞个双系统啥的,可能总是失败.我有血的教训啊. 从源头上可以解决分区问题,就是可以在安 ...

  2. 第一行代码阅读笔记---详解分析第一个Android程序

    以下是我根据作者的思路,创建的第一个Android应用程序,由于工具强大,代码都自动生成了,如下: package com.example.first_app; import android.os.B ...

  3. 2.7、Android Studio使用翻译编辑器本地化UI

    如果你的应用支持多语言,你需要合理的管理你的翻译的string资源.Android Studio 提供了翻译编辑器来使查看和管理翻译的资源更加容易. 关于翻译编辑器 翻译后的资源在你的项目里保存在不同 ...

  4. Android必知必会-使用okhttp的PUT方式上传文件

    注:如果移动端排版有问题,请看 简书版 (<-点击左边),希望CSDN能更好的支持移动端. 背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp ...

  5. 深入浅出Tabhost+简单入门Demo

    小伙伴们在手机上逛淘宝的时候,会发现在淘宝的下面有个按钮,分别是首页.微淘.社区.购物车和我的淘宝,点击不同的按钮会跳转到不同的页面,目前小编所接手的这个项目,也需要用到类似这样的功能,小编就发挥网络 ...

  6. (一〇〇)使用AddressBookUI实现通讯录操作

    上节提到使用AddressBook可以实现通讯录数据的获取,但有时需要用户自己选取联系人或者联系人信息,这时候就要借助AddressBookUI框架的ABPeoplePickerNavigationC ...

  7. Hessian源码分析--HessianProxyFactory

    HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类. 如下面代码: HessianProxyFactory factory = new ...

  8. UNIX环境高级编程——线程属性之分离属性

    说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: int pthread_join(pthread_t tid, v ...

  9. 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解

    这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序.  * 排序有两种方式  * A:自然排序: 从小到大排序  * B:比较器排序    Comp ...

  10. Ubuntu14.04安装配置星际译王词典

    参考自:http://m.blog.csdn.net/blog/u014731529/25917149 平常总会遇到一些不认识的单词,汉字等等.一直使用Chrome 浏览器的翻译插件,不过插件的翻译总 ...