objective-c中所谓的僵尸对象
正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写。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中所谓的僵尸对象的更多相关文章
- iOS僵尸对象之研究
Zombie Objects对象研究 一.Xcode 关闭ARC project -> Build settings 搜索 Automatic Reference Counting ...
- iOS-野指针与僵尸对象
野指针. C语言: 当我们声明1个指针变量,没有为这个指针变量赋初始值.这个指针变量的值是1个垃圾指 指向1块随机的内存空间. OC语言: 指针指向的对象已经被回收掉了.这个指针就叫做野指针. 僵尸对 ...
- iOS中僵尸对象的实现方法
什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都 ...
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...
- iOS 关于僵尸对象和僵尸指针的那些事儿
引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
随机推荐
- Java 拓展之调用其他语言
目前而言,编程语言真的是太多了.每一种都是一种智慧的结晶,但是每个都存在其缺点.网上经常能看到一些程序员争论"XX是世界上最好的语言"之类的话题.其实我们大可不必这样.语言本身只是 ...
- 开源框架Slidingmenu的基本使用
转载本博客请标明出处:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52464262 侧滑菜单在开发中经常用到,而Slidi ...
- 剑指Offer——二分查找算法
剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...
- ROS(indigo)ABB机器人MoveIt例子
ROS(indigo)ABB机器人例子 参考网址: 1 http://wiki.ros.org/Industrial 2 http://wiki.ros.org/abb 3 https://gi ...
- 开发Nginx模块Helloworld
本文是对<深入理解Nginx>一书中的实例进行实战时的记录. 1模块目录结构 my_test_module/ ├── config └── ngx_http_mytest_module.c ...
- A*寻路算法入门(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- B2B、B2C、B2D的简单理解
B2D现在非常流行,顾名思义,B2D 就是指那些以开发者为对象的服务,它们通过 API 等形式"售卖"自己某一方面的特长.B2D(Business to Developer)市场很 ...
- leetcode 20 Valid Parentheses 括号匹配
Given a string containing just the characters '(', ')', '{', '}', '[' and']', determine if the input ...
- React Native之样式
样式 React Native 不实现 CSS,而是依赖于 JavaScript 来为你的应用程序设置样式.这是一个有争议的决定,你可以阅读那些幻灯片,了解背后的基本原理. 声明样式 在 React ...
- 无法与域Active Directory域控制器(AD DC)连接(虚机加域出错问题)
今天建了两台虚机用的VMWARE,一台做域控,一台做应用服务器,但是部署好域控要把应用服务器加入域时候报错 虚机网卡设置桥接并设置好IP使两台虚机在同一个局域网内,通过ip地址互ping能ping通, ...