iOS僵尸对象之研究
Zombie Objects对象研究
一、Xcode 关闭ARC

二、开启 僵尸对象 选项


三、代码验证
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person =[[Person alloc]init];
NSLog(@"person:%@----%@",[self className:person],NSStringFromSelector(_cmd));
person.name=@"红叶";
[person release];
NSLog(@"person:%@",[self className:person]);
person.name=@"绿叶";
}
- (NSString*)className:(id)obj{
const char * name=object_getClassName(obj);
return [NSString stringWithUTF8String:name];
}
a.关闭ARC,关闭僵尸对象选项时
[person release];执行后,person对象会自动执行dealloc方法。因为Scheme中关闭了僵尸对象选项,所以person对象释放后并不会生成僵尸对象
当再次调用person对象时,报错类型为:错误内存地址访问异常

打印结果:
-- ::56.769 ZomObj[:] person:Person----viewDidLoad
b.关闭ARC,开启僵尸对象选项时
在[person release];之前
person对象为Person类,正常使用
在[person release];之后
person对象被释放了,由于scheme开启了僵尸对象选项,所以person对象在释放时调用的dealloc方法在底层被swizzle了
dealloc方法执行时,代码走的并不是清理资源,回收内存。而是copy了一个NSZombie对象模版,并修改zimbie对象的isa指针,形成了一个新的僵尸对象类_NSZombie_Person。所以在[person release];执行之后, 打印的person对象类型为_NSZombie_Person
_NSZombie_Person类中只有一个isa指针,里面没有其他的属性和方法,所以不能响应任何事件,所以在向这个僵尸对象发送消息时,就会报错,并打印出来。这非常有利于调试。
打印结果:
-- ::20.006 ZomObj[:] person:Person----viewDidLoad -- ::20.006 ZomObj[:] person:_NSZombie_Person -- ::20.007 ZomObj[:] *** -[Person setName:]: message sent to deallocated instance 0x6000000161d0 Message from debugger: Terminated due to signal
iOS僵尸对象之研究的更多相关文章
- iOS 关于僵尸对象和僵尸指针的那些事儿
引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...
- iOS中僵尸对象的实现方法
什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都 ...
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...
- iOS多线程的初步研究1
iOS多线程的初步研究(一) 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NS ...
- NSZombie 详解 -僵尸对象
1.什么是僵尸对象? 简而言之,就是过度释放的对象. 2.僵尸对象有什么特点? 如果一个对象a被变成了僵尸对象,那么,在进行下面的判断时,a是会被系统当成一个对象来进行判断的.但是,如果你使用a进行其 ...
- 用"僵尸对象"调试内存管理问题
Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...
- iOS多线程的初步研究(六)
iOS多线程的初步研究(六) iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成.运行等管理代码.当然实质上是这些接口隐含生成线程和管 ...
- iOS多线程的初步研究3
iOS多线程的初步研究(三) 弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜). 官网的解释是说run ...
- iOS多线程的初步研究
iOS多线程的初步研究(四) 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NST ...
随机推荐
- java并发的理解
我认为并发大体上分为两种情况 1,多个线程或者进程访问公共资源,比如12306 2,多个线程访问同一个实例变量,比如tomcat 多个请求的线程访问同一个单例bean,如果bean是有状态的,就可能出 ...
- JSP中setattribute与setParameter的区别
HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下区别: (1)HttpServletRequest类有setAttri ...
- 【转载】PHP.INI配置:Session配置详细说明教程
网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以P ...
- three.js 源码注释(四十四)Light/DirectionalLight.js
/** * * DirectionalLight方法 根据设置灯光的颜属性color, 强度属性intensity创建平行光光源. * DirectionalLight 对象的功能函数采用定义构造的函 ...
- 第六次课:springMVC与spring的集成
spring在项目中起到了管理bean的作用,即可以通过配置,让系统自动创建所需的对象,通过一定的方式引用系统创建的对象,对象的创建和引用都是由spring自动完成的,用户不必参与,可以直接引用. 实 ...
- [vb.net]XML File Parsing in VB.NET
Introduction Parsing XML files has always been time consuming and sometimes tricky. .NET framework p ...
- 1055: [HAOI2008]玩具取名
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用"WING" ...
- SpringMVC框架入门配置 IDEA下搭建Maven项目
初衷:本人初学SpringMVC的时候遇到各种稀奇古怪的问题,网上各种技术论坛上的帖子又参差不齐,难以一步到位达到配置好的效果,这里我将我配置的总结写到这里供大家初学SpringMVC的同僚们共同学习 ...
- Spring的定时任务配置(转)
spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 1.定义任务 <!--要定时执行的方法--> <bean id="testTas ...
- iOS 图片压缩
+ (UIImage *)scaleFromImage:(UIImage *)image { CGSize newSize = CGSizeMake(366, 366); //目标图片的大小 ...